如何通过XPath提取这样一个元素的文本:
<document>
some text
<subelement>subelement text</subelement>
postscript
</document>
XPath表达式:
/document
返回文档节点文本及其所有子节点文本:
some text subelement text postscript
而XPath表达式:
/document/text()
只返回第一个文本节点:
some text
也就是说,"postscript“缺失了。
问题
是否有一种方法可以获取所有文本节点的文本,这些节点都是<document>
的直接子节点?
Postscript
非常集中的例子,如果您想要测试自己,复制到一个主要的方法,并修复导入。
DocumentBuilder dbuilder = DocumentBuilderFactory.newInstance().newDocumentBuilder();
String xml = "<?xml version='1.0' encoding='UTF-8'?>" +
"<document>"
+ "some text into document"
+ " <subelement>"
+ " some text into SUBelement"
+ " </subelement>"
+ "POSTSCRIPT"
+ "</document>";
//i'm forced to use an InputSource because parse doesn't take readers directly :-(
Document doc = dbuilder.parse(new InputSource(new StringReader(xml)));
//usual way to get an xpath
XPath xp = XPathFactory.newInstance().newXPath();
System.out.println(xp.evaluate("/document", doc));
System.out.println(xp.evaluate("/document/text()",doc));
发布于 2011-09-22 16:56:09
而XPath表达式: /文件/案文() 只返回第一个文本节点: 文件中的一些文本 也就是说,"postscript“缺失了。
上面的XPath表达式返回/document
的所有文本节点子节点,但是XPath.evaluate()方法,没有第三个参数将其结果转换为字符串。在这个过程中,它的作用显然类似于<xsl:value-of>
,因为它只转换结果节点集中的第一个节点。
要打印所有文本节点子节点的值,请将XPathConstants.NODESET
作为XPath.evaluate()的第三个参数。这将为您提供文本节点的节点集,作为NodeList。然后,你可以循环它们,并打印每一个。或者,您可以尝试将NodeList直接传递给println(),看看它输出了什么。:-)
发布于 2011-09-22 16:50:44
刚刚测试
xp.evaluate("/document/text()",doc, XPathConstants.NODESET)
确实,返回所有文本子文件,但您正在执行
xp.evaluate("/document/text()", doc, XPathConstants.STRING)
它似乎只将节点中的第一个节点转换为字符串。因此,您可能需要找到另一种方法将NodeSet转换为字符串。
发布于 2011-09-22 16:56:41
这会让你得到所有的文本孩子。通常,依赖toString()
或试图返回字符串表示的方法在处理DOM时会导致失败。“把它做好/做好”总是更安全。
NodeList list = (NodeList) xp.evaluate("/document/text()", doc, XPathConstants.NODESET);
for (int i = 0; i < list.getLength(); i++) {
System.out.println(list.item(i).getNodeValue());
}
https://stackoverflow.com/questions/7518219
复制相似问题