使用python中的任何前缀按标记解析xml节点子列表

时间:2015-07-23 09:52:32

标签: python xml lxml domparser

我希望得到一个项目列表,与其前缀无关。 我的目标是创建方法(请注意我是否存在这样的东西),谁有一个参数(标记名)并返回元素列表。

例如,在参数&#39; item&#39; <media:item><abc:item>应该是此功能结果的一部分。

使用lxml会很好,但它可以是任何基于python DOM的解析器。

不幸的是,我不能假设,xml有xmlns,这就是我需要解析任何前缀的原因。

1 个答案:

答案 0 :(得分:1)

lxml是一个很好的选择,主要是因为除了许多其他有用的实用程序之外,它还通过xpath()方法完全支持XPath 1.0版。在XPath中,您可以使用注释中提到的local-name()来忽略元素名称空间。

lxml也可以通过设置参数recover=True来处理未定义的前缀,但现在来了; local-name()仍会返回带前缀的&#39;标记名&#39;对于具有未定义前缀的元素。通过查找本地名称​​包含 :tagname的元素,有一种与这种元素匹配的hacky方法 - 或者更准确地说,找到本地名称为ends with {{的元素1}}而不是包含 - 。

以下是演示的工作示例。该演示使用两个表达式与逻辑运算符:tagname相结合;一个用于处理具有未定义前缀的元素,另一个用于没有前缀或具有正确定义的前缀的元素:

or

输出

from lxml import etree

xml = """<root foo="bar">
    <media:item>a</media:item>
    <abc:item>b</abc:item>
    <foo:item>c</foo:item>
    <item>d</item>
</root>"""
parser = etree.XMLParser(recover=True)
tree = etree.fromstring(xml, parser=parser)
tagname = "item"
#expression to match element undefined prefix
predicate1 = "contains(local-name(),':{0}')".format(tagname)
#expression to match element with properly defined prefix or with no prefix
predicate2 = "local-name()='{0}'".format(tagname)
elements = tree.xpath("//*[{0} or {1}]".format(predicate1, predicate2))
for e in elements:
    print(etree.tostring(e))