如何在Java中使用xpathh读取xml的所有节点?

用户名

我有一个xml文件,我想读取xml的所有子节点的值。我的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扩展来获取特定的分支。

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>

但我想获取其子节点的值,例如branch-name branchID等,是否需要为每个子节点使用另一个xpath表达式,或者还有另一种方法?如果是,请指导我

疯狂程序员

你可以...

使用这样的路径/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节点的文本,将其解析为aDocument并在其上运行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();
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何在C#中使用xml解析器提取xml中节点的所有值?

来自分类Dev

如何在Java中使用xslt从纯文本读取所有数据?

来自分类Dev

如何在Java中使用其数据反转xml节点

来自分类Dev

如何在Java中使用DOM解析器解析XML文件时查找具有子节点的节点

来自分类Dev

如何在Java中使用DOM解析器解析XML文件时查找具有子节点的节点

来自分类Dev

如何在节点红色中使用XML有效负载进行POST

来自分类Dev

如何在节点红色中使用XML有效负载进行POST

来自分类Dev

如何使用javascript读取具有多个节点的xml文件

来自分类Dev

如何在XPath中使用XML值识别节点?

来自分类Dev

如何在vb.net中使用XML节点的if条件

来自分类Dev

如何在XPath中使用XML值识别节点?

来自分类Dev

如何在xml中读取子节点

来自分类Dev

如何在Python中使用LXML捕获XML文件的所有元素名称?

来自分类Dev

如何在Python中使用LXML捕获XML文件的所有元素名称?

来自分类Dev

如何在IOS中使用fstream读取XML文件

来自分类Dev

如何在Powershell中使用冒号读取xml属性

来自分类Dev

如何在Neo4j中使用单个查询删除所有子节点和关系?

来自分类Dev

如何使用XSLT从XML读取所有内部递归值

来自分类Dev

如何在Powershell中获得子XML节点的所有父节点

来自分类Dev

如何在NotePad ++中删除折叠的XML节点(和所有子节点)

来自分类Dev

如何在C中使用sscanf从字符串中读取所有双精度数字?

来自分类Dev

如何在Perl中使用XML :: LibXML访问处于同一级别的具有相同标签的节点?

来自分类Dev

如何使用VBA读取不同的节点xml

来自分类Dev

C# XDocument 从 XML 文件中读取所有节点

来自分类Dev

如何在Java中使用for循环打印所有数组

来自分类Dev

如何在Java中使用xpath从特定属性中选择所有属性值

来自分类Dev

如何在java中使用所有50ms的多线程查询数据

来自分类Dev

如何使用powershell仅导入父节点而从xml文件中保留所有子节点?

来自分类Dev

如何在Java中使用jssc从serialport读取数据?

Related 相关文章

  1. 1

    如何在C#中使用xml解析器提取xml中节点的所有值?

  2. 2

    如何在Java中使用xslt从纯文本读取所有数据?

  3. 3

    如何在Java中使用其数据反转xml节点

  4. 4

    如何在Java中使用DOM解析器解析XML文件时查找具有子节点的节点

  5. 5

    如何在Java中使用DOM解析器解析XML文件时查找具有子节点的节点

  6. 6

    如何在节点红色中使用XML有效负载进行POST

  7. 7

    如何在节点红色中使用XML有效负载进行POST

  8. 8

    如何使用javascript读取具有多个节点的xml文件

  9. 9

    如何在XPath中使用XML值识别节点?

  10. 10

    如何在vb.net中使用XML节点的if条件

  11. 11

    如何在XPath中使用XML值识别节点?

  12. 12

    如何在xml中读取子节点

  13. 13

    如何在Python中使用LXML捕获XML文件的所有元素名称?

  14. 14

    如何在Python中使用LXML捕获XML文件的所有元素名称?

  15. 15

    如何在IOS中使用fstream读取XML文件

  16. 16

    如何在Powershell中使用冒号读取xml属性

  17. 17

    如何在Neo4j中使用单个查询删除所有子节点和关系?

  18. 18

    如何使用XSLT从XML读取所有内部递归值

  19. 19

    如何在Powershell中获得子XML节点的所有父节点

  20. 20

    如何在NotePad ++中删除折叠的XML节点(和所有子节点)

  21. 21

    如何在C中使用sscanf从字符串中读取所有双精度数字?

  22. 22

    如何在Perl中使用XML :: LibXML访问处于同一级别的具有相同标签的节点?

  23. 23

    如何使用VBA读取不同的节点xml

  24. 24

    C# XDocument 从 XML 文件中读取所有节点

  25. 25

    如何在Java中使用for循环打印所有数组

  26. 26

    如何在Java中使用xpath从特定属性中选择所有属性值

  27. 27

    如何在java中使用所有50ms的多线程查询数据

  28. 28

    如何使用powershell仅导入父节点而从xml文件中保留所有子节点?

  29. 29

    如何在Java中使用jssc从serialport读取数据?

热门标签

归档