0

我有以下 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 仅获取特定产品的节点?

4

1 回答 1

1

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

传递product变量是合理且正确的,但您的 XPath 查询是错误的:表达式开头的斜线表示当前上下文/的根节点,在本例中是元素。<ONIXMessage/>

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

NodeList prova2 = XPathAPI.selectNodeList(product, "./RecordReference");
于 2013-07-19T20:46:08.033 回答