2014-10-31 95 views
0

我有一个xml文件,我想读取xml的所有子节点的值。我的xml是如何在java中使用xpathh读取xml的所有节点?

<branches> 
     <branch-area name="abc"> 
      <branch> 
       <branch-name> xyz Street</branch-name> 
       <branchID>5689742</branchID> 
       <branchAddress>xyz address</branchAddress> 
       <atm>true</atm> 
       <branch>true</branch> 
       <tab title="Contact"> 
     <![CDATA[<table> 
     <tr> 
      <td class="head">Branch</td> 
      <td>bandra Street</td> 
     </tr> 
     <tr> 
      <td class="head">Address</td> 
      <td>bandra Street</td> 
     </tr> 
     <tr> 
      <td class="head">Sort Code</td> 
      <td>215863</td> 
     </tr> 
     </table>]]> 
    </tab> 
      </branch> 
     </branch-area> 
     <branch-area name="def 11"> 
      <branch> 
       <branch-name>pqr</branch-name> 
       <branchID>123456</branchID> 
       <branchAddress>pqr address </branchAddress> 
       <atm>true</atm> 
       <branch>true</branch> 
       <tab title="Contact"> 
     <![CDATA[<table> 
     <tr> 
      <td class="head">Branch</td> 
      <td>bandra Street</td> 
     </tr> 
     <tr> 
      <td class="head">Address</td> 
      <td>bandra Street</td> 
     </tr> 
     <tr> 
      <td class="head">Sort Code</td> 
      <td>215863</td> 
     </tr> 
     </table>]]> 
      </tab> 
      </branch> 
     </branch-area> 
     <branch-area name="ghi 14"> 
      <branch> 
       <branch-name>jkl</branch-name> 
       <branchID>589674</branchID> 
       <branchAddress>jkl address</branchAddress> 
       <atm>true</atm> 
       <branch>true</branch> 
<tab title="Contact"> 
     <![CDATA[<table> 
     <tr> 
      <td class="head">Branch</td> 
      <td>bandra Street</td> 
     </tr> 
     <tr> 
      <td class="head">Address</td> 
      <td>bandra Street</td> 
     </tr> 
     <tr> 
      <td class="head">Sort Code</td> 
      <td>215863</td> 
     </tr> 
     </table>]]> 
    </tab> 
      </branch> 
     </branch-area> 
    </branches> 

并且我正在使用此xpath expreesion获取特定分支。

String xpathExpression = "/branches/branch-area[name='abc']/branch"; 

它返回我即

<branch> 
        <branch-name> xyz Street</branch-name> 
        <branchID>5689742</branchID> 
        <branchAddress>xyz address</branchAddress> 
        <atm>true</atm> 
        <branch>true</branch> 
<tab title="Contact"> 
     <![CDATA[<table> 
     <tr> 
      <td class="head">Branch</td> 
      <td>bandra Street</td> 
     </tr> 
     <tr> 
      <td class="head">Address</td> 
      <td>bandra Street</td> 
     </tr> 
     <tr> 
      <td class="head">Sort Code</td> 
      <td>215863</td> 
     </tr> 
     </table>]]> 
    </tab> 
       </branch> 

特定的分支,但我想它的孩子像分支名称branchID等方面的价值,做我需要使用另一个XPath表达式为每子节点还是有另一种方式呢?如果是,请指导我

回答

1

你可以...

使用像/branches/branch-area[@name='abc']/branch/*的路径将返回你NodeList包含与branch所有子节点。

XPath xpath = XPathFactory.newInstance().newXPath(); 
XPathExpression branchExp = xpath.compile("/branches/branch-area[@name='abc']/branch/*"); 
NodeList branchNodes = (NodeList) branchExp.evaluate(dom, XPathConstants.NODESET); 
System.out.println(branchNodes.getLength()); 
for (int index = 0; index < branchNodes.getLength(); index++) { 
    Node node = branchNodes.item(index); 
    System.out.println(node.getTextContent()); 
} 

,其输出类似...

5 
xyz Street 
5689742 
xyz address 
true 

你可以...

搜索每个单独的子节点,使用branch节点作为搜索的父节点.. 。

XPath xpath = XPathFactory.newInstance().newXPath(); 
XPathExpression branchExp = xpath.compile("/branches/branch-area[@name='abc']/branch"); 
Node branchNode = (Node) branchExp.evaluate(dom, XPathConstants.NODE); 

XPathExpression nameExp = xpath.compile("branch-name/text()"); 
String name = (String) nameExp.evaluate(branchNode, XPathConstants.STRING); 
System.out.println("Name = " + name); 

其中输出类似...

Name = xyz Street 

更新...

所以,CDATA不被XPATH处理,相反,你需要得到tab节点的文本,它解析为Document和在它运行的XPath ,例如...

try { 
    DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); 
    DocumentBuilder db = dbf.newDocumentBuilder(); 
    Document dom = db.parse(new File("Test.xml")); 
    XPath xpath = XPathFactory.newInstance().newXPath(); 

    // Find the "thing" node... 
    XPathExpression thingExpr = xpath.compile("/branches/branch-area/branch/tab"); 
    Node things = (Node) thingExpr.evaluate(dom, XPathConstants.NODE); 
    String table = things.getTextContent(); 

    ByteArrayInputStream bais = new ByteArrayInputStream(table.getBytes()); 
    Document tblDom = db.parse(bais); 
    XPathExpression tableExp = xpath.compile("/table/tr[td[text()='Sort Code']]/td[not(@*)]"); 
    NodeList nodes = (NodeList) tableExp.evaluate(tblDom, XPathConstants.NODESET); 
    System.out.println(nodes.getLength()); 
    for (int index = 0; index < nodes.getLength(); index++) { 
     Node node = nodes.item(index); 
     System.out.println(node.getTextContent()); 
    } 
} catch (Exception exp) { 
    exp.printStackTrace(); 
} 
+0

嗨,我只是更新我的xml,如果我想要一个表内的值我怎么能得到它们? – user2142786 2014-10-31 07:37:29

+0

你需要创建适当的路径,但过程是一样的 – MadProgrammer 2014-10-31 07:45:33

+0

好的谢谢队友:) – user2142786 2014-10-31 07:48:35