用于获取祖父母的 XPath 表达式

XPath expression for getting this grandparent

我是 XPath 的新手,正在使用一个 XML 文件,它看起来像这样:

<doc>
    <component>
        <author> Bob </author>
    </component>
    
    <component>
        <sB>
            <component>
                <section ID='S1'>
                    <title>Some s1 title</title>
                </section>
            </component>
            <component>
                <section ID='S2'>
                    <title>Some s2 title</title>
                </section>
            </component>
        </sB>
    </component>
</doc>

我想检索上面部分 ID = S1 的组件项目,或者检索带有文本 'Some s1 title' 的标题元素的组件项目。我不能指望这些东西是按特定顺序排列的。

到目前为止我已经试过了

import xml.etree.ElementTree as ET

tree = ET.parse('test.xml')
res = tree.getroot().findall(".//*[title='Some s1 title']../../")
for i in res:
    ET.dump(i)

但这让我得到了两个组件,而不仅仅是具有匹配标题的组件。

我也试过在部分 ID 级别进行搜索,如下所示:

res = tree.getroot().findall(".//*section[@ID='S1']/../")
for i in res:
    ET.dump(i)

但这并没有让我得到 parent(整个组件),而是让我得到了部分。

这两个 看起来 就像我在网上看到的简单示例语法一样,它们可能会起作用,但显然在这两种情况下我都缺少对实际发生的事情的一些理解.有人可以澄清这里发生的事情以及为什么我没有得到我期望的结果吗?

将您的 XPath 表达式制作成 select component,然后使用谓词(方括号内的条件)来确定您想要的 components。如:

component 包含 sectionID = 'S1'

//component[./section[@ID='S1']]

component包含section/title='Some s1 title'

//component[./section/title/text() = 'Some s1 title']

或包含 section 且 ID = 'S1' 且 section 具有 title = 'Some s1 title'

的组件
//component[./section[@ID='S1']/title/text() = 'Some s1 title']

及其其他变体是可能的。

您的两个 XPath 都存在语法错误:

  1. .//*[title='Some s1 title']../../ 谓词后缺少 /。然后这个无论如何向上冲。

  2. .//*section[@ID='S1']/../section 之前不能有 *。否则这个会起作用。

但是,与其从那里修复和工作,您真的不需要 select 沿父或祖先轴 — 无论如何最好使用层次结构中更高的谓词...


这个 XPath,

//component[section/@ID='S1']

select 具有 section 个子元素且 id 属性值等于 'S1'.

component 元素

这个 XPath,

//component[section/title='Some s1 title']

selects 具有 section 个子元素和 title 个子元素且字符串值等于 'Some s1 title'.

component 个元素

关于 Python XPath 库夸克的注释:

  • 元素树:Noncompliant。避免。
  • lxml:使用 xpath() 而不是 findall()

另见