我希望得到一个项目列表,与其前缀无关。 我的目标是创建方法(请注意我是否存在这样的东西),谁有一个参数(标记名)并返回元素列表。
例如,在参数&#39; item&#39; <media:item>
,<abc:item>
应该是此功能结果的一部分。
使用lxml会很好,但它可以是任何基于python DOM的解析器。
不幸的是,我不能假设,xml有xmlns,这就是我需要解析任何前缀的原因。
答案 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))