Java DOM解析器强制转换错误
这是一个简单的决策树,广度和深度优先搜索程序。在我的print-tree方法中,我使用与搜索方法相同的元素强制转换过程,当我单独运行print-tree方法时,我没有得到任何错误,当我取消对搜索方法的注释时,我在main中得到一个异常,在depth-first和width-first方法中都得到一个cannot-cast异常,但树仍然打印。在我获得方法中的根子级之后,异常特别来自强制转换行。我需要对这一点有新的认识,无论如何,我对在java中使用xml是全新的,所以我很紧张 xml:(评论说我错误地假设所有的子节点都是元素,我实际上假设所有的节点都是节点,而不是元素,它们可以转换为元素,对不起) 主要内容: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:(评论说我错
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)