Java 处理混合内容的XPath
如何通过XPath提取此类元素的文本:Java 处理混合内容的XPath,java,xml,xpath,Java,Xml,Xpath,如何通过XPath提取此类元素的文本: <document> some text <subelement>subelement text</subelement> postscript </document> 返回文档节点文本及其所有子节点文本: some text subelement text postscript 而XPath表达式: /document /document/text() 仅返回
<document>
some text
<subelement>subelement text</subelement>
postscript
</document>
返回文档节点文本及其所有子节点文本:
some text subelement text postscript
而XPath表达式:/document
/document/text()
仅返回第一个文本节点:
some text
some text into 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));
DocumentBuilder dbuilder=DocumentBuilderFactory.newInstance().newDocumentBuilder();
字符串xml=“”+
""
+“将某些文本转换为文档”
+ " "
+“将某些文本转换为子元素”
+ " "
+“附言”
+ "";
//我被迫使用InputSource,因为parse不直接接收读取器:-(
documentdoc=dbuilder.parse(新的InputSource(新的StringReader(xml));
//获取xpath的常用方法
XPath xp=XPathFactory.newInstance().newXPath();
System.out.println(xp.evaluate(“/document”,doc));
System.out.println(xp.evaluate(“/document/text()”,doc));
XPath/document/text()
将返回document
元素的所有子文本节点。在您的示例中:一些文本和postscript
。我想(我不知道Java类)System.out.println
自动将节点集转换为字符串表示,在本例中它只返回第一个节点。XPath/document/text()
将返回document
元素的所有子文本节点。在您的示例中:一些文本和postscript
。我想(我不知道Java类)System.out.println
自动将节点集转换为字符串表示,在这种情况下,它只返回第一个节点。刚刚测试过
xp.evaluate("/document/text()",doc, XPathConstants.NODESET)
确实返回所有文本子级,但您正在执行
xp.evaluate("/document/text()", doc, XPathConstants.STRING)
它似乎只将节点集中的第一个节点转换为字符串。因此,您可能需要找到另一种方法将节点集转换为字符串。刚刚测试过
xp.evaluate("/document/text()",doc, XPathConstants.NODESET)
确实返回所有文本子级,但您正在执行
xp.evaluate("/document/text()", doc, XPathConstants.STRING)
它似乎只将节点集中的第一个节点转换为字符串。因此,您可能需要找到另一种方法将节点集转换为字符串
而XPath表达式:
/document/text()
仅返回第一个文本节点:
some text
some text into document
也就是说,“后记”不见了
上面的XPath表达式返回/document
的所有文本节点子级,但将其结果转换为字符串。
在这个过程中,它的行为显然类似于
,因为它只转换结果节点集中的第一个节点
要打印所有文本节点子节点的值,请提供XPathConstants.NODESET
作为XPath.evaluate()的第三个参数。这将为您提供文本节点的NODESET作为。然后您可以循环遍历它们并打印每个节点。或者您可以尝试将NodeList直接传递给println(),并查看它打印的内容。:-)
而XPath表达式:
/document/text()
仅返回第一个文本节点:
some text
some text into document
也就是说,“后记”不见了
上面的XPath表达式返回/document
的所有文本节点子级,但将其结果转换为字符串。
在这个过程中,它的行为显然类似于
,因为它只转换结果节点集中的第一个节点
要打印所有文本节点子节点的值,请提供XPathConstants.NODESET
作为XPath.evaluate()的第三个参数。这将为您提供文本节点的节点集作为一个整体。然后您可以循环浏览它们并打印每一个。或者您可以尝试将节点列表直接传递给println(),然后查看它打印的内容。:-) 这将获得所有文本子项。通常,在处理DOM时,依赖toString()
或尝试返回字符串表示的方法会导致撕裂。“完全做到/正确做到”总是更安全的
NodeList list=(NodeList)xp.evaluate(“/document/text()”,doc,XPathConstants.NODESET);
对于(int i=0;i
这将获得所有文本子项。通常,在处理DOM时,依赖toString()
或尝试返回字符串表示的方法会导致撕裂。“完全做到/正确做到”总是更安全的
NodeList list=(NodeList)xp.evaluate(“/document/text()”,doc,XPathConstants.NODESET);
对于(int i=0;i
将结果转换为字符串的不是println(),而是不带类型参数的XPath.evaluate()(并且只使用结果节点集中的第一个节点)。将结果转换为字符串的不是println(),而是不带类型参数的XPath.evaluate()(并且只使用结果节点集中的第一个节点)。