2013-07-19 3 views
0

У меня есть следующие XML:Xerces Xpath - поиск узла с другого узла

<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

I подумайте, что этот код должен возвращать 3 2 3 1, потому что переменная «prova» содержит все «RecordReference» узлы документа, а «prova2» содержит только определенные узлы «RecordReference» только одного продукта.

Как я могу использовать XPATH для получения только узлов определенного продукта?

ответ

1

Первым параметром для XPathAPI#selectNodeList является контекст выражения XPath.

Передача переменной product разумно и правильно, но ваш XPath запрос является неправильным: слэш / в начале выражения деноминирован корневой узел текущего контекст, который в данном случае является <ONIXMessage/> элементом.

Вместо этого начните с текущего контекста, который представлен точкой .. Помните, что ваше новое выражение начинается в этом контексте, поэтому ваш новый XPath будет ./RecordReference. Вы можете даже опустить ./, но я предпочитаю добавлять эти два символа, упрощая чтение и понимание запроса:

NodeList prova2 = XPathAPI.selectNodeList(product, "./RecordReference"); 
Смежные вопросы