我想获得一个项目列表,与其前缀无关。 我的目标是创建一种方法(如果存在类似的情况,请注意我),该方法有一个参数(标记名)并返回元素列表。
例如,在参数“item”的情况下<media:item>
, <abc:item>
应该是该函数结果的一部分。
使用 lxml 会很好,但它可以是任何基于 python DOM 的解析器。
不幸的是,我不能假设 xml 有 xmlns,这就是为什么我需要解析任何前缀。
最佳答案
lxml
是一个不错的选择,主要是因为除了许多其他有用的实用程序之外,它还通过 xpath()
方法完全支持 XPath 版本 1.0。在 XPath 中,您可以使用注释中提到的 local-name()
来忽略元素 namespace 。
lxml
还可以通过设置参数 recover=True
来处理未定义的前缀,但现在出现了问题; local-name()
仍然为具有未定义前缀的元素返回前缀“tagname”。有一种巧妙的方法来匹配这种元素,通过查找本地名称包含 :tagname
的元素 - 或者更准确地说,查找本地名称 ends with
的元素: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))
输出:
<media:item>a</media:item>
<abc:item>b</abc:item>
<foo:item>c</foo:item>
<item>d</item>
关于python - 在python中按带有任何前缀的标签解析xml节点子列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31583892/