2015-11-01 56 views
0

我有這樣的XML結構。如何在xml中獲取路徑

<?xml version="1.0" encoding="UTF-8" ?> 
<root> 
    <child1 name="1"/> 
    <child2 name="2"/> 
    <child3 name="3"> 
      <condition>x>=50</condition> 
      <childofchild3 name="3.1"> 
      <condition>y<40</condition> 
       <childOfchild3.1 name="3.1.1"> 
        <condition>a>70</condition> 
         <step> 
         <a1> 
          <aa1> </aa1> 
         </a1> 
         <b1 /> 
         </step> 

        <c1> 
         <a1> 
         <aa1> </aa1> 
         </a1>  
        </c1> 
      </childOfchild3.1> 
      <c1> 
       <a1> 
       <aa1> </aa1> 
       </a1> 
      </c1> 
      </childOfchild3> 
      <c1> 
      <a1> 
       <aa1> </aa1> 
      </a1> 
     </c1> 
    </child3> 
    <child4 name="4" /> 
</root> 

我必須使用java打印帶有值的節點路徑。這裏是我得輸出的樣本:

這是最後的Java代碼,但它不能正常工作

public class xmlPath{ 
static List <String []> valueList = new ArrayList<String []>() ; 
static String rootPath = ""; 
    public static void showPath(){ 
     try{ 
     File xml = new File("test.xml"); 

     String nextNode=""; 
     DocumentBuilderFactory dbFactory=DocumentBuilderFactory.newInstance(); 
     DocumentBuilder dBuilder = dbFactory.newDocumentBuilder(); 
     Document doc = dBuilder.parse(xml); 
     Element root = doc.getDocumentElement(); 
     rootPath += "root"; 
     NodeList sequenceList = doc.getElementsByTagName("root"); 
     Element sequenceNode = (Element) sequenceList.item(0); 
     NodeList sequenceChildList = sequenceNode.getChildNodes(); 

     for(int i=0;i<sequenceChildList.getLength();i++){ 

      if(sequenceChildList.item(i) instanceof Element && sequenceChildList.item(i).getNodeType() == Node.ELEMENT_NODE){ 

       nextNode = rootPath+" > "+ sequenceChildList.item(i).getNodeName(); 

        if(sequenceChildList.item(i).hasChildNodes()){ 
         findPath(sequenceChildList.item(i).getChildNodes(), nextNode); 
        } 
        else{ 
         if(sequenceChildList.item(i).hasAttributes()){   
          NamedNodeMap nameAttr = sequenceChildList.item(i).getAttributes(); 
           for(int j=0;j<nameAttr.getLength();j++){ 
            Node node = nameAttr.item(j); 
           if ("name".equals(node.getNodeName())) { 
            valueList.add(new String []{nextNode,node.getNodeValue()}); 

            } 
           } 
         } 


        } 
      } 
     } 
     Iterator <String []> iT = valueList.iterator(); 
     for(;iT.hasNext();){ 
      String [] val = iT.next(); 
      if(!val[0].contains("condition")){ 
      System.out.println(val[0]+" = "+val[1]); 
      } 
     } 
     } catch(Exception e){ 
      e.printStackTrace(); 
     } 
    } 
    public static void findPath(NodeList seQuenceList,String listPath){ 
     String path, value,count,name=null; 
     Node nextNode; 
     for(int i=0;i<seQuenceList.getLength();i++){ 


      if(seQuenceList.item(i) instanceof Element){ 

       path = listPath+" > "+seQuenceList.item(i).getNodeName(); 


        if(seQuenceList.item(i).getChildNodes().getLength() >=1){ 

         findPath(seQuenceList.item(i).getChildNodes(), path); 
        } 

        else if(!seQuenceList.item(i).hasChildNodes()){ 
         nextNode= nextNode(seQuenceList.item(i)); 
          if(nextNode !=null){ 
           findPath(nextNode.getChildNodes(), listPath); 
          } 
          if(nextNode ==null){ 

           System.out.println("Not chileNode"); 
           valueList.add(new String []{listPath,name}); 
          } 

        }        
      } 
     } 
    } 
    public static Node nextNode(Node currentNode){ 
      Node nextNode = currentNode.getNextSibling(); 
      if(currentNode.getNodeType() ==Node.ELEMENT_NODE){ 
       while(!(nextNode instanceof Element) && nextNode != null){ 
        nextNode = nextNode.getNextSibling(); 
       } 
      } 
      return nextNode; 
    } 

這是實際輸出。

child1 
child2 
child3 -> childOfchild3 -> childOfchild3.1 -> a1 -> aa1 
chile3 -> childOfchild3 -> childOfchild3.1 -> c1 -> a1 -> aa1 
child3 -> childOfchild3 -> c1 -> a1 -> aa1 
child3 -> c1 -> a1 -> aa1 
child4 

Plese幫助我使它正確無誤。不需要使用遞歸來解決問題。謝謝。

+0

你能整理一下孩子的智利混亂嗎? –

+2

此外,你能否解釋爲什麼兄弟關係(child1和child2)似乎與父母關係(child3和childof3)的表現方式相同,這裏的邏輯是什麼?爲什麼有些標籤只是在輸出中跳過(如「step」)? –

+0

好吧,我正在編輯 – chatchai

回答

-1
public static void main(String[] args) throws IOException, SAXException { 
     DocumentBuilder builder = JOOX.builder(); 
     Document xmlExampleDocument = builder.parse(XMLTEST.class.getResourceAsStream("/sample.xml")); 
     List<String> doneList = $(xmlExampleDocument).xpath("//*[not(*)]").map(context -> $(context).xpath() + "='" + $(context).text() + "'"); 
     for (String x : doneList) { 
      System.out.println(x); 
     } 
    } 
+0

1.您的XML格式不正確。修理它。 2.考慮使用JOOX API:編譯'org.jooq:joox:1.2.0' 3.共享示例代碼。 –

+0

謝謝你的回答,但我從不使用JOOX API。阿米特Parashar plese幫助我一次。現在我使用DOM來解決問題 – chatchai

+0

在這種情況下,請遵循Blaise Doughan的解決方案,地址爲http://stackoverflow.com/questions/4746299/generate-get-xpath-from-xml-node-java。這很好。 –