【问题标题】:How do I select tags with XPATH based on their relational position?如何根据标签的关系位置选择带有 XPATH 的标签?
【发布时间】:2020-01-15 11:25:07
【问题描述】:

我是 XPATH 的新手,想弄清楚如何从以下代码中选择标签:

                                <content>
                                    <par>
                                        <include.text>
                                            <RefControl/>
                                        </include.text>
                                        <linebreak/>
                                        <include.text>
                                            <RefControl/>
                                        </include.text>
                                        <linebreak/>
                                        <include.text>
                                            <RefControl/>
                                        </include.text>
                                        <linebreak/>
                                        <include.text>
                                            <RefControl/>
                                        </include.text>, T3C</par>
                                </content>

我可以使用以下 XPATH 选择第一个 &lt;include.text&gt; 标记://include.text[not(preceding-sibling::node())]

对此我没问题(我需要这种方式来区分在 XML 中使用不同的 &lt;include.text&gt; 标记)。

那么我需要什么 XPATH 表达式:

1) 选择&lt;linebreak&gt; 标记的XPATH 表达式不是基于&lt;par&gt;(在这种情况下),而是基于紧随其后的&lt;include.text&gt;。我会想到这样的事情://include.text/preceding-sibling::linebreak 但它不起作用。

2) XPATH 表达式选择不紧跟&lt;par&gt;&lt;include.text&gt; 标记。我不能使用“没有前面的兄弟姐妹”(如上所述),因为有前面的兄弟姐妹。但是,我仍然需要能够区分在 XML 中不同位置使用的所有 &lt;include.text&gt; 标签(所以也没有 //include.text)。

注意:&lt;par&gt; 是任意的(也可以是另一个标签名称),所以我不能在 XPATH 中使用它。

我希望我已经清楚地解释了这一点。感谢您的帮助!

【问题讨论】:

  • 另外,从这个问题和你的上一个问题来看,很明显,通过实现 XPath 在节点级别进行选择,包括 元素,你在这方面的理解和交流会得到改善>,不是开始或结束标签。
  • 感谢您的反馈!我知道我还有很多关于 Xpath 的知识要学习,这有助于我理解。

标签: xml xpath


【解决方案1】:

XPath 为

  1. 选择所有linebreak元素,其紧邻元素兄弟是include.text

    //linebreak[preceding-sibling::*[1][self::include.text]]
    
  2. 根据同级位置选择include.text 元素:

    //par/include.text[1] 选择 par 父级的第一个 include.text 同级。

    //include.text[1] 选择第一个 include.text 同级,无论继承。

    //include.text[not(preceding-sibling::*)] 仅在没有任何类型的先前节点时才选择include.text

    //include.text[not(preceding-sibling::node())] 仅在没有先前元素时选择 include.text

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-09-25
    • 1970-01-01
    • 2012-01-31
    • 2015-04-26
    • 1970-01-01
    • 2010-10-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多