首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >XPath处理混合内容

XPath处理混合内容
EN

Stack Overflow用户
提问于 2011-09-22 16:27:19
回答 4查看 160关注 0票数 1

如何通过XPath提取这样一个元素的文本:

代码语言:javascript
运行
复制
<document>
  some text
     <subelement>subelement text</subelement>
  postscript
</document>

XPath表达式:

代码语言:javascript
运行
复制
/document

返回文档节点文本及其所有子节点文本:

代码语言:javascript
运行
复制
some text         subelement text    postscript

而XPath表达式:

代码语言:javascript
运行
复制
/document/text()

只返回第一个文本节点:

代码语言:javascript
运行
复制
some text

也就是说,"postscript“缺失了。

问题

是否有一种方法可以获取所有文本节点的文本,这些节点都是<document>的直接子节点?

Postscript

非常集中的例子,如果您想要测试自己,复制到一个主要的方法,并修复导入。

代码语言:javascript
运行
复制
    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));
EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2011-09-22 16:56:09

而XPath表达式: /文件/案文() 只返回第一个文本节点: 文件中的一些文本 也就是说,"postscript“缺失了。

上面的XPath表达式返回/document的所有文本节点子节点,但是XPath.evaluate()方法,没有第三个参数将其结果转换为字符串。在这个过程中,它的作用显然类似于<xsl:value-of>,因为它只转换结果节点集中的第一个节点。

要打印所有文本节点子节点的值,请将XPathConstants.NODESET作为XPath.evaluate()的第三个参数。这将为您提供文本节点的节点集,作为NodeList。然后,你可以循环它们,并打印每一个。或者,您可以尝试将NodeList直接传递给println(),看看它输出了什么。:-)

票数 1
EN

Stack Overflow用户

发布于 2011-09-22 16:50:44

刚刚测试

代码语言:javascript
运行
复制
xp.evaluate("/document/text()",doc, XPathConstants.NODESET)

确实,返回所有文本子文件,但您正在执行

代码语言:javascript
运行
复制
xp.evaluate("/document/text()", doc, XPathConstants.STRING)

它似乎只将节点中的第一个节点转换为字符串。因此,您可能需要找到另一种方法将NodeSet转换为字符串。

票数 2
EN

Stack Overflow用户

发布于 2011-09-22 16:56:41

这会让你得到所有的文本孩子。通常,依赖toString()或试图返回字符串表示的方法在处理DOM时会导致失败。“把它做好/做好”总是更安全。

代码语言:javascript
运行
复制
        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());
        }
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7518219

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档