2016-06-16 4 views
0

좋아, 그래서 이것은 간단한 의사 결정 트리, 폭과 깊이 첫 번째 검색 프로그램입니다. 내 인쇄 트리 메서드에서 메신저 내 검색 메서드에서 같은 요소 캐스팅 프로세스를 사용하여, 나는 내 자신의 인쇄 트리 메서드를 실행할 때 오류가 발생하지 않습니다. 내 검색 메서드의 주석을 제거 할 때 주 및 예외를 얻을 수 없습니다. 첫 번째와 두 번째 방법 모두에서 예외를 캐스팅하지만 트리가 여전히 인쇄됩니다. 예외는 메소드에서 루트 자식을 얻은 후에 캐스트 행에서 구체적으로 온 것입니다. 나는 이것에 대한 새로운 시각을 필요로한다. 어쨌든 자바에서 xml을 사용하는 것에 익숙하다. 그래서 나는 내 머리카락을 꺼내고있다.자바 DOM 파서 캐스팅 오류

XML은 :

<root> 
<node behavior="Idle" response=""> 
     <node behavior="" response="Use Computer"/> 
     <node behavior="" response="Patrol"/> 
</node> 
<node behavior="Incoming Projectile"> 
     <node behavior="" response="Evade"/> 
</node> 
<node behavior="Combat" response=""> 
     <node behavior="Melee" response=""> 
      <node behavior="" response="Flee"/> 
      <node behavior="" response="Attack"/> 
     </node> 
     <node behavior="Ranged" response=""> 
      <node behavior="" response="Weapon 1"/> 
      <node behavior="" response="Weapon 2"/> 
      <node behavior="" response="Weapon 3"/> 
     </node> 
</node> 
</root> 

(코멘트 메신저 잘못 모든 자식 노드는 요소, 실제로 모든 노드는 노드가 아닌 요소가 있다고 가정하고 죄송합니다, 그들이 요소에 캐스트 할 수 있다는 것을 가정 것을 말한다)

Specify BehaviorIdle 
behavior= Idle 
Exception in thread "main"  response= Use Computer 
     response= Patrol 
behavior= Incoming Projectile 
     response= Evade 
behavior= Combat 
    behavior= Melee 
     response= Flee 
     response= Attack 
    behavior= Ranged 
     response= Weapon 1 
     response= Weapon 2 
     response= Weapon 3 
java.lang.ClassCastException:com.sun.org.apache.xerces.internal.dom.DeferredTextImpl cannot be cast to org.w3c.dom.Element 
at XmlTree.breadthFirst(XmlTree.java:58) 
at decisiontree.main(decisiontree.java:34) 

홈페이지 :

내가 말했듯이 내가 첫 번째 예외가 그나마 그것으로 검색을 실행 해달라고하면 난의 검색과 인쇄 나무를 실행할 때이 프로그램의 출력입니다
import java.util.*; 

import org.w3c.dom.Document; 
import org.w3c.dom.Node; 
import org.w3c.dom.NodeList; 

public class decisiontree { 

public static void main(String[] args) { 
    Scanner scan = new Scanner(System.in); 
    ArrayList <org.w3c.dom.Node> queue = new ArrayList<org.w3c.dom.Node>(); 
    int dCounter = 0; 
    int bCounter = 0; 

    System.out.print("Type in path for xml file: "); 
    String path = scan.nextLine(); 

    System.out.print("Specify Behavior"); 
    String target = scan.nextLine(); 

    scan.close(); 


    XmlTree dTree = new XmlTree(); 
    Document doc =dTree.xmlIn(path); 


    NodeList thisList = doc.getElementsByTagName("root"); 
    Node root = thisList.item(0); 

    dTree.printTree(doc); 

    String dResponse = dTree.depthFirst(root, target, dCounter); 
    String bResponse = dTree.breadthFirst(root, queue, target, bCounter); 

    System.out.println("Behavior: "+ target +"\n"+"Depth First Response: " + dResponse + 
         "\n" + "Breadth First Response: "+ bResponse + "\n" + "Depth First Took "+ 
         dCounter + " jumps"+"\n"+"Breadth First Took "+ bCounter +" jumps"); 

    } 

} 

인쇄 트리 : 첫 번째

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")); 
      } 
     } 
    } 
} 

깊이 :

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; 
} 

너비 첫째 :

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; 
} 
+0

당신은 잘못 '의 모든 자식 노드가'요소 노드 있다고 가정합니다. 다른 하위 노드가 무엇인지에 대한 설명이 필요하면 질문을 편집하고 읽고있는 XML을 포함하십시오. – VGR

+0

@vgr - xml이 추가되었습니다. – Tucker

답변

0

당신의 XML의 처음 두 행에서 상대 :

<root> 
<node behavior="Idle" response=""> 

<root>의 첫 번째 하위 노드는 <node> 요소 인 것처럼 보일 수 있지만 그렇지 않습니다.

첫 번째 아이는 개방 <root> 태그와 첫 <node>의 시작 사이의 텍스트를 나타내는, 실제로 그 문자 내용 "\n "입니다 (이 플랫폼의 라인에 따라 또는 가능 "\r\n ", 문서가 사용하는 XML을 엔딩)를 Text 객체이며, 꼬리표. 두 번째 하위 요소는 <node> 요소입니다.

가장 간단한 문제는 진행하기 전에 if (nodes instanceof Element) 검사를 수행하는 것입니다. XPath에 익숙하다면 대신 코드를 사용하면됩니다.

주의 :==!=을 사용하는 문자열 비교는 결국 실패합니다. Java에서는 메소드 호출을 사용하여 String 객체를 비교해야합니다.이와

nodeElement.getAttribute("behavior") == "" 

:

nodeElement.getAttribute("behavior").isEmpty() 

와 마찬가지로이 대체해야이 함께

nodeElement.getAttribute("behavior") != "" 

을 :

!nodeElement.getAttribute("behavior").isEmpty() 

에서를이를 교체해야 일반적으로 문자열을 임의의 값과 비교하려는 경우 빈 문자열 이외의 경우 equals 메서드를 사용해야합니다. 예를 들어 :

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

그렇다면 나무를 인쇄하는 동일한 방법론이 왜 효과가 있습니까? 또한 내 코드 doesNode nodeElement 비교에 도착, 그것은 캐스팅 오류를 던질 수 없습니다 던졌습니다. 당신의 말은 그 뿌리가 노드가 아니기 때문에? – Tucker

+0

breadthFirst 메서드는'root.getChildNodes()'를 호출하여 NodeList를 얻는 반면, printTree 메서드는 getElementsByTagName 메서드를 호출하여 NodeList를 가져옵니다. getElementsByTagName 메서드는 getChildNodes와 달리 Element 만 포함하는 노드 목록을 반환합니다. – VGR

+0

오! 내가 참조. 감사! – Tucker