Java DOM解析器强制转换错误

Java DOM解析器强制转换错误,java,xml,dom,elements,decision-tree,Java,Xml,Dom,Elements,Decision Tree,这是一个简单的决策树,广度和深度优先搜索程序。在我的print-tree方法中,我使用与搜索方法相同的元素强制转换过程,当我单独运行print-tree方法时,我没有得到任何错误,当我取消对搜索方法的注释时,我在main中得到一个异常,在depth-first和width-first方法中都得到一个cannot-cast异常,但树仍然打印。在我获得方法中的根子级之后,异常特别来自强制转换行。我需要对这一点有新的认识,无论如何,我对在java中使用xml是全新的,所以我很紧张 xml:(评论说我错

这是一个简单的决策树,广度和深度优先搜索程序。在我的print-tree方法中,我使用与搜索方法相同的元素强制转换过程,当我单独运行print-tree方法时,我没有得到任何错误,当我取消对搜索方法的注释时,我在main中得到一个异常,在depth-first和width-first方法中都得到一个cannot-cast异常,但树仍然打印。在我获得方法中的根子级之后,异常特别来自强制转换行。我需要对这一点有新的认识,无论如何,我对在java中使用xml是全新的,所以我很紧张

xml:(评论说我错误地假设所有的子节点都是元素,我实际上假设所有的节点都是节点,而不是元素,它们可以转换为元素,对不起)

主要内容:

import java.util.*;
导入org.w3c.dom.Document;
导入org.w3c.dom.Node;
导入org.w3c.dom.NodeList;
公共类决策树{
公共静态void main(字符串[]args){
扫描仪扫描=新扫描仪(System.in);
ArrayList队列=新建ArrayList();
int-dCounter=0;
int bCounter=0;
System.out.print(“输入xml文件的路径:”);
字符串路径=scan.nextLine();
系统输出打印(“指定行为”);
String target=scan.nextLine();
scan.close();
XmlTree dTree=新的XmlTree();
文档doc=dTree.xmlIn(路径);
NodeList thisList=doc.getElementsByTagName(“根”);
节点根=此列表。项(0);
数据树、打印树(doc);
String dResponse=dTree.depthFirst(根、目标、数据计数器);
String breresponse=dTree.breadthFirst(根、队列、目标、b计数器);
System.out.println(“行为:“+target+”\n“+”深度优先响应:“+dResponse+
“\n”+”广度优先响应:“+b响应+”\n”+“深度优先”+
数据计数器+“跳跃”+“\n”+“宽度优先”+b计数器+“跳跃”);
}
}
打印树:

public void printTree(Document doc){

    NodeList rootList = doc.getElementsByTagName("root");
    org.w3c.dom.Node root = rootList.item(0);
    Element rootElement = (Element) root;
    NodeList nodeList = rootElement.getElementsByTagName("node");

    for(int i = 0; i < nodeList.getLength(); i++){
        org.w3c.dom.Node nodes = nodeList.item(i);
        Element nodeElement = (Element) nodes;
        if(nodeElement.getAttribute("behavior") != ""){
            if(nodeElement.getParentNode() != rootElement){
                System.out.println("    behavior= " + nodeElement.getAttribute("behavior"));
            }else{
                System.out.println("behavior= " + nodeElement.getAttribute("behavior"));
            }
        }else if(nodeElement.getAttribute("behavior") == ""){
            if(nodeElement.getParentNode() != rootElement.getChildNodes()){
                System.out.println("        response= " + nodeElement.getAttribute("response"));
            }else{
                System.out.println("    response= " + nodeElement.getAttribute("response"));
            }
        }
    }
}
公共作废打印树(文档文档){
nodelistrootlist=doc.getElementsByTagName(“根”);
org.w3c.dom.Node root=rootList.item(0);
元素根元素=(元素)根;
NodeList NodeList=rootElement.getElementsByTagName(“节点”);
for(int i=0;i
深度优先:

public String depthFirst(org.w3c.dom.Node root, String target, int dCounter){

    if (root.getChildNodes() == null){
        return "no tree";
    }
    dCounter++;
    NodeList nL = root.getChildNodes(); 
    for(int i = 0;i < nL.getLength();i++){
        org.w3c.dom.Node node = nL.item(i); 
        Element nodeElement = (Element) node;   //ERROR ON THIS LINE
        if(nodeElement.getAttribute("behavior") == target){
            while(nodeElement.hasChildNodes()){
                NodeList newNL = nodeElement.getChildNodes();
                Random rand = new Random();
                int x = rand.nextInt(newNL.getLength());
                node = newNL.item(x);
                Element newElement = (Element) node;
                nodeElement = newElement;
                dCounter++;
            }
        String response = nodeElement.getAttribute("response");
        return response;
        }else{
            depthFirst(node, target, dCounter);
        }
    }

    return null;
}
publicstringdepthfirst(org.w3c.dom.Node root,stringtarget,int-dCounter){
if(root.getChildNodes()==null){
返回“无树”;
}
dCounter++;
NodeList nL=root.getChildNodes();
对于(int i=0;i
广度优先:

public String breadthFirst(Node root, ArrayList<org.w3c.dom.Node> q, String target, int bCounter){

    if(!root.hasChildNodes()){
        return "no tree";
    }
    bCounter++;
    NodeList nL = root.getChildNodes();
    for(int i = 0; i < nL.getLength(); i++){
        q.add(nL.item(i));
    }
    Node node = q.get(0);
    Element nodeElement = (Element) node;   // ERROR ON THIS LINE

    if(nodeElement.getAttribute("behavior") != target){
        q.remove(0);
        Node newNode = q.get(0);
        Element newElement = (Element) newNode;
        breadthFirst(newElement, q, target, bCounter);
    }
    if(nodeElement.getAttribute("behavior") == target){
        while(nodeElement.hasChildNodes()){
            NodeList newNL = node.getChildNodes();
            Random rand = new Random();
            int x = rand.nextInt(newNL.getLength());
            Element newElement = (Element) newNL.item(x);;
            nodeElement = newElement;
            bCounter++;
        }
    String response = nodeElement.getAttribute("response");
    return response;
    }
    return null;
}
publicstringbreadthfirst(节点根、ArrayList q、字符串目标、int bCounter){
如果(!root.hasChildNodes()){
返回“无树”;
}
b计数器++;
NodeList nL=root.getChildNodes();
对于(int i=0;i
查看XML的前两行:

<root>
 <node behavior="Idle" response="">
为此:

nodeElement.getAttribute("behavior").isEmpty()
!nodeElement.getAttribute("behavior").isEmpty()
同样,您需要替换以下内容:

nodeElement.getAttribute("behavior") == ""
nodeElement.getAttribute("behavior") != ""
为此:

nodeElement.getAttribute("behavior").isEmpty()
!nodeElement.getAttribute("behavior").isEmpty()
通常,如果要将字符串与空字符串以外的任何值进行比较,则需要使用equals方法。例如:

nodeElement.getAttribute("behavior").equals(target)

您错误地假设
的所有子节点都是元素节点。如果您想了解其他子节点是什么,请编辑您的问题并包含您正在阅读的XML。好的,那么您知道为什么同样的方法可以打印树吗?另外,我的代码无法进行nodeElement比较,它抛出了一个cannot cast错误。你说这是因为根不是节点吗?breadthFirst方法是通过调用
nodeElement.getAttribute("behavior").equals(target)