后代的xpath条件

时间:2015-09-24 18:59:03

标签: xml xpath lxml

我有下一个xml样本结构

<root>

<rec xmlns="some_url">
<itemNumber>
<number>1</number>
</itemNumber>
</rec>

<rec>
<itemNumber>
<number>2</number>
</itemNumber>
</rec>

<rec>
<itemNumber>
<number>2</number>
</itemNumber>
</rec>

</root>

问题是这里是xmlns并找到一些我需要通过本地名称找到它的元素。例如,查找所有<rec>元素:

root.xpath("*[local-name() = 'rec']")

查找所有itemNumber

root.xpath("*[local-name() = 'rec']/*[local-name() = 'itemNumber']")

主要障碍是命名空间。但是不建议我删除名称空间,因为我的xml文档非常庞大,需要额外的时间。 我需要返回符合条件的<rec>个元素,例如<number>等于2的情况。在这种情况下它会返回

<rec>
<itemNumber>
<number>1</number>
</itemNumber>
</rec>

1 个答案:

答案 0 :(得分:1)

  

问题是这里是xmlns ...

使用名称空间并不是特别困难with lxml

在XPath调用中,您只需传递一个namespaces参数,其前缀映射到此some_url。然后你只需要在元素名称前面使用那个前缀。

示例ipython会话:

In [1]: import lxml.etree

In [2]: doc = lxml.etree.fromstring("""<root>

<rec xmlns="some_url">
<itemNumber>
<number>1</number>
</itemNumber>
</rec>

<rec>
<itemNumber>
<number>2</number>
</itemNumber>
</rec>

<rec>
<itemNumber>
<number>2</number>
</itemNumber>
</rec>

</root>""")

In [3]: doc.xpath('ns:rec[ns:itemNumber=1]', namespaces={"ns": "some_url"})
Out[3]: [<Element {some_url}rec at 0x7f358cccd2d8>]

In [4]: