XPath 表达式有条件地获取相邻节点

Posted

技术标签:

【中文标题】XPath 表达式有条件地获取相邻节点【英文标题】:XPath Expression to get adjacent nodes conditionally 【发布时间】:2018-06-15 16:44:48 【问题描述】:

我有一个包含如下内容的 xml 文件:

<p>
    <r>
        <t xml:space="preserve">Reading is easier, </t>
    </r>
    <r>
        <fldChar fldCharType="begin"/>
    </r>
    <r>
        <instrText xml:space="preserve"> REF _Ref516568558 \r \p \h </instrText>
    </r>
    <r>
        <fldChar fldCharType="separate"/>
    </r>
    <r>
        <t>This is all the text I want to capture</t>
    </r>
    <r>
        <fldChar fldCharType="end"/>
    </r>
    <r>
        <t xml:space="preserve">, in the new Reading view </t>
    </r>
    <r>
        <fldChar fldCharType="begin"/>
    </r>
    <r>
        <instrText xml:space="preserve"> REF _Not516755367 \r \h </instrText>
    </r>
    <r>
        <fldChar fldCharType="separate"/>
    </r>
    <r>
        <t>But not this...</t>
    </r>
    <r>
        <fldChar fldCharType="end"/>
    </r>
    <r>
        <t xml:space="preserve"> Some other text... </t>
    </r>
</p>

我知道我可以使用 XPath 表达式//instrText[contains(text(), '_Ref')] 来获取&lt;instrText xml:space="preserve"&gt; REF _Ref516568558 \r \p \h &lt;/instrText&gt;

现在我想要得到的是在&lt;fldChar fldCharType="begin"/&gt;&lt;fldChar fldCharType="end"/&gt; 之间的t 节点内的文本,如果在这两个标签之间有一个instrText,其文本包含'_Ref'instrText[contains(text(), '_Ref']

基于此,从示例 xml 中,我希望只返回:&lt;t&gt;This is all the text I want to capture&lt;/t&gt;

这可以用一个 XPath 1.0 表达式来完成吗?

【问题讨论】:

【参考方案1】:

试试这个:p/r[preceding-sibling::r[fldChar/@fldCharType='begin'] and following-sibling::r[fldChar/@fldCharType='end']]/t[contains(., '_Ref')]

【讨论】:

这目前不起作用,但我可以看到它的发展方向......我将继续尝试它。谢谢指点。 这仍然有问题... But not this 仍然返回,因为前面的兄弟姐妹检查了所有前面的兄弟姐妹... 为什么不显示But not this?您可以在原始帖子中添加预期的输出吗?【参考方案2】:

这就是我最终使用的://p/r[preceding-sibling::r[fldChar/@fldCharType='begin'] and following-sibling::r[fldChar/@fldCharType='end']][instrText[contains(text(), '_Ref')]]/following-sibling::r[t][1]

【讨论】:

以上是关于XPath 表达式有条件地获取相邻节点的主要内容,如果未能解决你的问题,请参考以下文章

Xpath基础

XPATH路径表达式

35XPath的使用示例

python--爬虫(XPath与xml类库)

dom4j+Xpath的简单路径表达式获取节点元素内容和属性值

xPath技术