我有下一个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>
答案 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]: