使用Python元素树进行XML解析-有时未指定命名空间
我试图解析一些xml文件,这些文件有时只设置了xmlns。有没有办法确定是否使用lxml库设置为w/o 我的主要问题是在使用find或findall查找元素时,如果设置了名称空间,则不会返回任何内容,因为标记不匹配。但是我不能硬编码名称空间,因为有时没有名称空间集。我真的不知道该怎么办 下面是我的一些代码示例使用Python元素树进行XML解析-有时未指定命名空间,python,xml,elementtree,Python,Xml,Elementtree,我试图解析一些xml文件,这些文件有时只设置了xmlns。有没有办法确定是否使用lxml库设置为w/o 我的主要问题是在使用find或findall查找元素时,如果设置了名称空间,则不会返回任何内容,因为标记不匹配。但是我不能硬编码名称空间,因为有时没有名称空间集。我真的不知道该怎么办 下面是我的一些代码示例 tree = ET.parse(xml_file_path) root = tree.getroot() #ONIXmessage ... pids = product.finda
tree = ET.parse(xml_file_path)
root = tree.getroot() #ONIXmessage
...
pids = product.findall("productidentifier")
...
所以我的主要问题是findall()方法
谢谢。这有点痛苦,但您可以在XPath中使用 例如,而不是:
/foo/bar/baz
尝试:
我很快也会遇到这个问题。我的想法是:使用一个包装器函数,首先尝试获取没有指定名称空间的元素,如果返回
None
,则尝试使用名称空间。如果两者都返回None,则元素不存在。如果没有提供默认名称空间,那么使用这两个函数(没有if-else)可以很好地工作
如果在指定或不指定同一名称空间之间进行选择,那么我认为上面的方法是可以的。如果您有多个可选名称空间,这将使包装器更加复杂,但这是一次性的
不过,我希望看到一个更优雅的解决方案。DanielHaley的回答有用吗
相关选项:
- 在
,find
等中还可以指定名称空间findall
- 可以根据解决方案进行尝试,该解决方案适用于书写
- 建议使用
查找,但这太通用,无法用于查找特定元素*
- 如果不顾一切,你可以试试
/*[local-name()='foo']/*[local-name()='bar']/*[local-name()='baz']