0

我有一个示例 xml 文件,如下所示:

<Root>
    <SubOne>
       <book author="george" />
       <indiv name="abc" />
       <indiv name="khh" />
       <indiv name="ioo" />
    </SubOne>
    <SubTwo>
       <indiv book author="hamle" />
       <indiv name="kok"/>
       <indiv name="ppp" />
    </SubTow>

</Root>

XPATH 中有没有办法检查,如果 author="george" 选择 /Root/SubOne/indiv/@name,或者如果 author="hamle",选择 /Root/SubTwo/indiv/@name。任何帮助表示赞赏

4

2 回答 2

1

首先我注意到你XML的无效。

假设您的 XML 如下所示。

XML:

<Root>
    <SubOne>
        <book author="george"/>
        <indiv name="abc"/>
        <indiv name="khh"/>
        <indiv name="ioo"/>
    </SubOne>
    <SubTwo>
        <book author="hamle"/>
        <indiv name="kok"/>
        <indiv name="ppp"/>
    </SubTwo>
</Root>

路径:

对于@author='george',使用这个 XPATH:

//*[book[@author='george']]/indiv

对于@author='hamle',使用这个 XPATH:

//*[book[@author='hamle']]/indiv

对于两个 XPATH,要打印名称,请使用@name

爪哇:

使用 Java,您需要为两个 xpath 实现这种方式

对于@author='george',

String xpath = "//*[book[@author='george']]/indiv";
NodeList nl = (NodeList) xpath.evaluate(xpath, xml, XPathConstants.NODESET);
for (int i = 0; i < nodes.getLength(); i++) {
    System.out.println(nodes.item(i).getAttributes().getNamedItem("name").getNodeValue()); 
}

对于@author='hamle',

String xpath = "//*[book[@author='hamle']]/indiv";
NodeList nl = (NodeList) xpath.evaluate(xpath, xml, XPathConstants.NODESET);
for (int i = 0; i < nodes.getLength(); i++) {
    System.out.println(nodes.item(i).getAttributes().getNamedItem("name").getNodeValue()); 
}
于 2012-06-27T19:25:13.283 回答
0

我猜你在节点 /Root/SubTwo/indiv 中有错字。这应该有效(我没有检查)

/Root/SubOne/book[@author='george']/following-sibling::1/@name | /Root/SubTwo/book[@author='hamle']/following-sibling::1/@name

它使用联合,所以这不完全是你正在寻找的。

于 2012-06-26T05:55:51.507 回答