如果没有“text()”结束,XPath查询将无法工作

时间:2012-07-03 04:32:51

标签: java xml parsing xpath

所以我试图在这里学习一些xml解析,并且我已经掌握了它,但无论出于何种原因,我似乎必须在每个查询结束时使用“text()”,否则我得到null值返回给我。我实际上并不理解这个“text()”结尾的功能,但我知道这没有必要,我想知道为什么我不能省略它。请帮忙!这是我的代码:

import org.w3c.dom.*;
import javax.xml.xpath.*;
import javax.xml.parsers.*;
import java.io.IOException;
import org.xml.sax.SAXException;

public class ParseClass 
{
public static void main(String[] args)
throws ParserConfigurationException, SAXException,
IOException, XPathExpressionException 
{
    DocumentBuilderFactory domFactory = DocumentBuilderFactory.newInstance();
    domFactory.setNamespaceAware(true);
    DocumentBuilder builder = domFactory.newDocumentBuilder();
    Document doc = builder.parse("C:\\Users\\Brandon\\Job\\XPath\\XPath_Sample_Stuff\\catalog.xml");
    XPath xpath = XPathFactory.newInstance().newXPath();
    XPathExpression expr = xpath.compile("/catalog/book[author='Thurman, Paula']/title/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());
    }
  }
}

PS。如果您没有注意到。我正在使用XPath和DOM进行解析。

3 个答案:

答案 0 :(得分:5)

您在结果上调用了getNodeValue,并且this docs显示(请参阅表格)null类型为Element的节点。当您使用text()时,返回的集合现在包含Text类型的节点,因此您可以获得所需的结果(即title元素的内容而不是元素本身)。

我还建议您查看this以获取有关xpath中text()用法的更多信息。

如果您想直接从元素中提取文字,可以使用getTextContent代替getNodeValue

// Will work for both element and text nodes
System.out.println(nodes.item(i).getTextContent());

答案 1 :(得分:1)

首先你的Xpath表达式无效(我认为它是拼写错误)。属性用@表示,因此正确的xpath将为/catalog/book[@author='Thurman, Paula']/title/text()

/catalog/book[@author='Thurman, Paula']/title/将与您的xml中的<title>节点匹配,而/catalog/book[@author='Thurman, Paula']/title/text()<title>的文本节点匹配,即如果标题节点类似于<title>The Godfather</title>后面的表达式将匹配The Godfather

答案 2 :(得分:1)

建议:不要使用DOM。 Java世界中有许多XML表示形式(JDOM,XOM,DOM4J),它们比DOM更有用。 DOM充满了刚刚遇到的问题,其中元素上的getNodeValue()返回null。任何人使用DOM的唯一原因是(a)它最初来自W3C,(b)它进入JDK。但这一切都发生在很久很久以前,人们从设计错误中吸取了教训。