【问题标题】:XPath to only select the text contained within an elementXPath 仅选择元素中包含的文本
【发布时间】:2017-04-12 12:43:43
【问题描述】:

我是 xpath 的新手,所以我提前为这个问题的基本性道歉。

如何仅从特定元素中提取文本?例如,我如何只提取“文本”

<h1>text</h1>

我尝试了以下方法,但它似乎选择了包括标签在内的所有内容,而不仅仅是文本。

//h1/text()

感谢您的帮助

【问题讨论】:

  • 当然它不会选择任何标签,因为标签不是可供选择的对象:源树上没有标签,只有节点。如果您描述导致您对问题做出错误诊断的症状,将会有所帮助。

标签: xpath


【解决方案1】:
`
DocumentBuilderFactory docFactory = DocumentBuilderFactory
                    .newInstance();
            DocumentBuilder docBuilder = docFactory.newDocumentBuilder();

            Document doc = docBuilder.parse(new File("src/myFile.xml"));

            XPathFactory factory = XPathFactory.newInstance();
            XPath xpath = factory.newXPath();

             String sessionId = (String) xpath
    .evaluate(
                            "/Envelope/Body/LoginProcessResponse/loginResponse/sessionId",
                            doc, XPathConstants.STRING);
`

这里的信封是我的父元素,我只是遍历到所需的路径(在我的例子中是 sessionid)。 希望对你有帮助

【讨论】:

    【解决方案2】:

    这个答案是一个 XSLT 答案而不是 XPath 答案,但许多概念仍然适用。

    XPath 表达式

    //h1/text()
    

    似乎是正确的。它确实选择了作为&lt;h1&gt; 元素的直接子级的所有text() 节点。

    但一个问题可能是,XSL 默认模板仍然复制所有其他text() 节点,就像描述的here in the W3C specification

    在没有选择属性的情况下,xsl:apply-templates 指令处理当前节点的所有子节点,包括文本节点。

    因此,要解决您的问题,您必须像这样定义一个
    忽略所有其他 text() 节点的显式模板:

    <xsl:template match="text()" />
    

    如果您将此行添加到您的 XSL 处理中,结果很可能会让您更满意。

    【讨论】:

      猜你喜欢
      • 2019-05-06
      • 2023-03-18
      • 1970-01-01
      • 1970-01-01
      • 2011-01-05
      • 2011-04-20
      • 2014-11-02
      • 2021-10-27
      • 2018-06-15
      相关资源
      最近更新 更多