xerces Xpath - 来自另一个节点的搜索节点

时间:2013-07-19 18:28:29

标签: java xpath xml-parsing xerces xerces2-j

我有以下XML:

    <ONIXMessage>
        <Product>
            <RecordReference>9786071502131</RecordReference>
            <RecordReference>9786071502131</RecordReference>
        </Product>
        <Product>
            <RecordReference>9786071502131</RecordReference>
        </Product>
    </ONIXMessage>

以下java代码:

    Element ONIXmessage = document.getDocumentElement();
    products = XPathAPI.selectNodeList(ONIXmessage, "/ONIXMessage/Product");

    for(int i = 0;i < products.getLength();i++) {  
        Node product = products.item(i);

        NodeList prova = XPathAPI.selectNodeList(ONIXmessage, "/ONIXMessage/Product/RecordReference");
        System.out.println(prova.getLength());

        NodeList prova2 = XPathAPI.selectNodeList(product, "/ONIXMessage/Product/RecordReference");
        System.out.println(prova2.getLength()); 
    }   

此代码返回:3 3 3 3

我认为此代码应返回3 2 3 1,因为“prova”变量包含文档的所有“RecordReference”节点,而“prova2”仅包含仅一个产品节点的特定“RecordReference”节点。

如何使用XPATH仅获取特定产品的节点?

1 个答案:

答案 0 :(得分:1)

XPathAPI#selectNodeList的第一个参数是XPath表达式的上下文。

传递product变量是合理和正确的,但是您的XPath查询是错误的:表达式开头的斜杠/表示当前上下文的根节点 ,在这种情况下是<ONIXMessage/>元素。

相反,从当前上下文开始,由点.表示。请记住,您的新表达式是从此上下文开始的,因此您的新XPath将为./RecordReference。你甚至可以省略./,但我更喜欢添加这两个字符,使查询更容易阅读和理解:

NodeList prova2 = XPathAPI.selectNodeList(product, "./RecordReference");