2016-03-03 6 views
1

У меня есть XML следующим образом,оценка XPATH против дочернего узла

<students> 
<Student><age>23</age><id>2000</id><name>PP2000</name></Student> 
<Student><age>23</age><id>1000</id><name>PP1000</name></Student> 
</students> 

У меня есть 2 XPaths шаблона XPATH = students/Student будут узлы шаблона, но я не могу жесткий код этого XPath, так как она будет меняться для других XMLs и XML является довольно динамичным, можно расширить (но с тем же базовым XPaths) Так что, если я оцениваю еще один XPATH, используя узел шаблона, я использую следующий код,

XPath xpathResource = XPathFactory.newInstance().newXPath(); 
    Document xmlDocument = //creating document; 
    NodeList nodeList = (NodeList)xpathResource.compile("//students/Student").evaluate(xmlDocument, XPathConstants.NODESET); 
    for (int nodeIndex = 0; nodeIndex < nodeList.getLength(); nodeIndex++) { 
     Node currentNode = nodeList.item(nodeIndex); 
     String xpathID = "//students/Student/id"; 
     String xpathName = "//students/Student/name"; 
     NodeList childID = (NodeList)xpathResource.compile(xpathID).evaluate(currentNode, XPathConstants.NODESET); 
     NodeList childName = (NodeList)xpathResource.compile(xpathName).evaluate(currentNode, XPathConstants.NODESET); 
     System.out.println("node ID " +childID.item(0).getTextContent()); 
     System.out.println("node Name " +childName.item(0).getTextContent()); 
    } 

Теперь проблема, это для цикла будет выполняться в 2 раза, но оба раза я получаю 2000 , PP2000 как значение идентификатора. Есть ли способ перебора дочернего узла с общим XPATH на узел. Я не могу использовать общий XPATH для всего XMLDocument, у меня есть какая-то проверка. Я хочу использовать XML-ноделист как строки набора результатов, чтобы я мог проверить значение XML и делать свои вещи.

+0

Изменить этот System.out.println ("node" + child.item (0) .getTextContent()); to System.out.println ("node" + child.item (nodeIndex) .getTextContent()); – pringi

+0

Также нет необходимости перебирать первый NodeList. Просто удалите цикл for и оставьте последние две строки в цикле for. Затем итерации дочернего узла NodeList, чтобы получить все studentIds. – pringi

+0

@pringi Я не могу пойти с nodeIndex, если у второго 'Student' нет узла' name', я могу получить исключение индекса. –

ответ

0
XPath xpathResource = XPathFactory.newInstance().newXPath(); 
    Document xmlDocument = //creating document; 
    NodeList nodeList = (NodeList)xpathResource.compile("//students/Student/id").evaluate(xmlDocument, XPathConstants.NODESET); 

for (int nodeIndex = 0; nodeIndex < nodeList.getLength(); nodeIndex++) { 
     Node currentNode = nodeList.item(nodeIndex); 

     System.out.println("node " +currentNode.getTextContent()); 
    } 
+0

Мне также нужен идентификатор и имя. Как и набор записей, если это единственный узел, я могу сделать это хорошо, это зависит от нескольких узлов, поэтому я сейчас в SO .. :) –

+0

Попробуйте следующее: JXPathContext.newContext (currentNode) .getValue ("// студентов/студент/идентификатор "); Получить имя похоже – pringi

Смежные вопросы