Как получить все узлы, имеющие текст, используя XPath в Java - PullRequest
0 голосов
/ 01 ноября 2018

Так что я довольно новичок в выражениях Xpath и использую его с Java. Я пытаюсь проанализировать файл XML, чтобы получить все узлы, имеющие некоторый текст между тегами. Например, если у меня есть XML как

<employee>
   <emp>John <age>25</age>
   </emp>
   <salary> 1000
   </salary>
</employee>

Тогда я должен получить

Иоанна 25 1000

Т.е. только текстовое содержимое между любыми тегами без получения дубликатов. Я следую этому учебнику здесь, чтобы использовать выражение Xpath для получения желаемых значений. Я написал следующий фрагмент:

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.xpath.XPath;
import javax.xml.xpath.XPathConstants;
import javax.xml.xpath.XPathExpression;
import javax.xml.xpath.XPathFactory;

import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.NodeList;;

public class xpathTest {

public static void main(String[] args) throws Exception
{
    DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
    factory.setNamespaceAware(true); // never forget this!
    DocumentBuilder builder = factory.newDocumentBuilder();
    Document doc = builder.parse("TestXmlFile.xml");

    //Create XPath

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

    XPathExpression expr = xpath.compile("//*[text()]"); // to get all all nodes having some text

    Object result = expr.evaluate(doc, XPathConstants.NODESET);
    NodeList nodes = (NodeList) result;
    for (int i = 0; i < nodes.getLength(); i++) {
        System.out.println(nodes.item(i).getNodeValue());

    }
}

Проблема, с которой я сталкиваюсь в этом коде, заключается в том, что он только возвращает мне нулевые значения вместо этих текстовых значений. Не могли бы вы заметить, что я делаю здесь не так?

...