Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/379.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 处理混合内容的XPath_Java_Xml_Xpath - Fatal编程技术网

Java 处理混合内容的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() 仅返回

如何通过XPath提取此类元素的文本:

<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()(并且只使用结果节点集中的第一个节点)。