2016-03-20 4 views
0

Так что мне нужно разобрать XML-файл с помощью XPath. Все работает хорошо, но если у меня есть тег, который присутствует более одного раза, мой код отображает все подталки всех тегов внутри тега. Например: у меня естьXPath Parser java redundancy

<a> 
    <b></b> 
</a> 
<c></c> 
<a> 
    <b></b> 
</a> 

выход будет:

a 
b 
b 
c 
a 
b 
b 

мой код это:

public void parseFileXPath() throws ParserConfigurationException, IOException, SAXException, XPathExpressionException { 
    DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance(); 
    DocumentBuilder documentBuilder = documentBuilderFactory.newDocumentBuilder(); 
    Document doc = documentBuilder.parse(file); 
    doc.getDocumentElement().normalize(); 

    XPathFactory factory = XPathFactory.newInstance(); 
    XPath xpath = factory.newXPath(); 

    String expression; 
    Node node; 
    NodeList nodeList; 

    expression="/*"; 
    node = (Node) xpath.evaluate(expression,doc, XPathConstants.NODE); 
    //System.out.println(node.getNodeName()); 

    expression="/frogans-fsdl/*"; 
    nodeList = (NodeList) xpath.evaluate(expression,doc, XPathConstants.NODESET); 


    NodeList nodeList1; 


    for (int i = 0; i < nodeList.getLength(); i++) { 
     String aTag = nodeList.item(i).getNodeName(); 

     System.out.println(aTag); 
     expression="/frogans-fsdl/"+aTag+"/*"; 
     nodeList1 = (NodeList) xpath.evaluate(expression,doc,XPathConstants.NODESET); 

     for (int j = 0; j < nodeList1.getLength(); j++) { 

      System.out.println("\t"+nodeList1.item(j).getNodeName()); 
      //TODO 
      //Display what's inside each tag 
     } 

     expression=""; 
    } 



} 

Любая помощь, пожалуйста?

ответ

1

Следующий внутренний код цикла может помочь то, что вывод, который вы хотите:

NodeList nodeList1; 

    for (int i = 0; i < nodeList.getLength(); i++) { 
     System.out.println(nodeList.item(i).getNodeName()); 
     expression="*"; 
     nodeList1 = (NodeList) xpath.evaluate(expression,nodeList.item(i),XPathConstants.NODESET); 
     for (int j = 0; j < nodeList1.getLength(); j++) { 
      System.out.println("\t"+nodeList1.item(j).getNodeName()); 
     } 
    } 

В основном вам нужно пройти nodeList.item (I) в качестве второго аргумента последующей оценки XPATH.

+0

Спасибо вам большое! –

0

Ваш первый xath находит всех детей frogans-fsdl. Что, вероятно, a,c,a С вашим вторым xpaht /frogans-fsdl/a/*" вы смотрите в документе whol для всех детей frogans-fsdl/a /,/frogans-fsdl/c/и/frogans-fsdl/a/снова.

Вы должны изменить свой второй xpaht на * и использовать nodeList.item (i) в качестве контекстного узла для вашего второго вызова оценки.

+0

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