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

2 java xml xpath parsing

所以我试图在这里学习一些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());
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

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

mgi*_*nbr 5

您正在调用getNodeValue您的结果,并且正如此文档所示(请参阅表格),它null适用于类型的节点Element.当您使用时text(),返回的集合现在包含类型的节点Text,因此您可以获得所需的结果(即title元素的内容而不是元素本身).

我还建议看一下这个有关text()xpath 用法的更多信息.

如果你想直接从你的元素中提取文本,你可以使用getTextContent而不是getNodeValue:

// Will work for both element and text nodes
System.out.println(nodes.item(i).getTextContent());
Run Code Online (Sandbox Code Playgroud)