如何使用XPath获取节点和节点值

时间:2013-07-12 09:08:46

标签: java dom xpath xml-parsing

我正在使用xPath来获取节点值。这是我的xml

<?xml version="1.0" encoding="UTF-8"?>

<address>
    <buildingnumber> 29 </buildingnumber>
    <street> South Lasalle Street</street>
    <city>Chicago</city>
    <state>Illinois</state>
    <zip>60603</zip>
</address>

这是我起诉的代码

DocumentBuilder builder = tryDom.getDocumentBuilder();
Document xmlDocument = tryDom.getXmlDocument(builder, file);

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

XPathExpression xPathExpression = null;

String expression7 = "//address/descendant-or-self::*";

try {

    xPathExpression = xPath.compile(expression7);
    Object result = xPathExpression.evaluate(xmlDocument,XPathConstants.NODESET);
    printXpathResult(result);

} catch (XPathExpressionException e1) {
    // TODO Auto-generated catch block
    e1.printStackTrace();
}

public static void printXpathResult(Object result){

    NodeList nodes = (NodeList) result;

    for (int i = 0; i < nodes.getLength(); i++) {

        Node node = nodes.item(i);
        String nodeName = node.getNodeName();
        String nodeValue = node.getNodeValue();

        System.out.println(nodeName + " = " + nodeValue);

    }

} //end of printXpathResult()

我得到的输出是

address = null
buildingnumber = null
street = null
city = null
state = null
zip = null

我期待这个输出

address = null
buildingnumber =  29
street = South Lasalle Street
city = Chicago
state = Illinois
zip = 60603

为什么我得到null虽然建筑物数量和其他值有价值?我怎样才能得到我想要的输出?

由于

修改 -------------------------------------------------- ------------

 public static void printXpathResult(Object result){

    NodeList nodes = (NodeList) result;

    for (int i = 0; i < nodes.getLength(); i++) {

        Node node = nodes.item(i);
        String nodeName = node.getNodeName();
        String nodeValue = node.getTextContent();

        System.out.println(nodeName + " = " + nodeValue);

    }

} //end of printXpathResult()

在此之后我得到以下输出

address = 
 29 
 South Lasalle Street
Chicago
Illinois
60603

buildingnumber =  29 
street =  South Lasalle Street
city = Chicago
state = Illinois
zip = 60603

为什么我得到地址= 29 ....我认为它应该是address = null

由于

1 个答案:

答案 0 :(得分:0)

在DOM API中,{em>指定{em>始终为元素节点返回getNodeValue()(请参阅table at the top of the JavaDoc page for Node)。您可能需要getTextContent()代替。

但是,请注意,对于null元素,address不会给您null,而是您将获得所有文本节点后代的连接,包括空格。在实际用例中,您可能在xpath中使用getTextContent()而不是descendant::,因此您不必专门处理父元素,或使用类似

的内容
descendant-or-self::

将结果限制为叶元素(那些本身没有任何子元素的元素)。