使用Python Etree解析XML并返回指定的标记,无论命名空间如何

时间:2011-11-20 05:49:59

标签: python-3.x xml-parsing xml-namespaces elementtree

我正在处理一些XML数据,这些数据在每个文件的某些位置重新定义了命名空间。我试图从文档中提取特定类型的所有标记,而不管标记位于XML中的活动名称空间是什么。

我正在使用findall('.//{namespace}Tag')来查找我正在寻找的元素。但是永远不知道{namespace}在文件中的任何给定点会是什么,会让它命中或遗漏我是否会返回所有请求的标签。

有没有办法返回所有Tag元素,无论它们属于{namespace}?有些事情findall('.//{wildcard}Tag')

1 个答案:

答案 0 :(得分:3)

lxml的xpath函数支持local-name()!

这是一个Python 3示例:

import io
from lxml import etree
xmlstring = '''<root
xmlns:m="http://www.w3.org/html4/"
xmlns:n="http://www.w3.org/html5/">
<m:table>
  <m:tr>
    <m:name>Sometext</m:name>
  </m:tr>
</m:table>
<n:table>
  <n:name>Othertext</n:name>
</n:table>
</root>'''
root = etree.parse(io.StringIO(xmlstring))
names = root.xpath("//*[local-name() = 'name']")
for name in names:
    print(name.text)

lxml etree xmlparser namespace problem

之前,您的问题可能已被解决