python - 在python中按带有任何前缀的标签解析xml节点子列表

标签 python xml lxml domparser

我想获得一个项目列表,与其前缀无关。 我的目标是创建一种方法(如果存在类似的情况,请注意我),该方法有一个参数(标记名)并返回元素列表。

例如,在参数“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/

相关文章:

java - Log4j 日志附加到取决于日期的文件名 - 配置

python - tree.xpath() 使用 lxml 库在 Webscraping 中返回空列表

python - 我如何把它变成一个 numpy 矩阵?

python - python3.6中根据提供的输入动态地将一个字典拆分为多个字典

python - RuntimeError : Given groups=1, 大小 [64, 3, 3, 3] 的权重,预期输入 [4, 5000, 5000, 3] 有 3 个 channel ,但有 5000 个 channel

ios - swift 2 中的 XML 解析器在设备上返回 false

python - 使用 os.environ.setdefault 安全吗?

xml - 无法读取子内部的公共(public)标量

python - lxml:元素不是该节点的子节点

python - 如何读取plist中的响应字符串?