所以我试图在这里学习一些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进行解析。
答案 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。但这一切都发生在很久很久以前,人们从设计错误中吸取了教训。