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

「prova」変数にはドキュメントのすべての「RecordReference」ノードが含まれ、「prova2」には 1 つの製品ノードのみの特定の「RecordReference」ノードのみが含まれるため、このコードは 3 2 3 1 を返すはずです。

XPATH を使用して特定の製品のノードのみを取得するにはどうすればよいですか?

4

1 に答える 1

1

への最初のパラメーターXPathAPI#selectNodeListは、XPath 式のコンテキストです。

変数を渡すことproductは合理的で正しいですが、XPath クエリは間違っています。/式の先頭にあるスラッシュは、現在のコンテキストのルート ノード (この場合は<ONIXMessage/>要素) を指定します。

代わりに、ドットで表される現在のコンテキストから開始します.。新しい式はこのコンテキストで開始されるため、新しい XPath は になります./RecordReference。を省略することもできますが./、クエリを読みやすく理解しやすくするために、次の 2 つの文字を追加することをお勧めします。

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