使用Python元素树进行XML解析-有时未指定命名空间

使用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

我试图解析一些xml文件,这些文件有时只设置了xmlns。有没有办法确定是否使用lxml库设置为w/o

我的主要问题是在使用find或findall查找元素时,如果设置了名称空间,则不会返回任何内容,因为标记不匹配。但是我不能硬编码名称空间,因为有时没有名称空间集。我真的不知道该怎么办

下面是我的一些代码示例

 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
    等中还可以指定名称空间
  • 可以根据解决方案进行尝试,该解决方案适用于书写
  • 建议使用
    *
    查找,但这太通用,无法用于查找特定元素
  • 如果不顾一切,你可以试试

+1可选名称空间我不太确定如何使用Daniel的解决方案,因此我最终使用了一个包装函数来添加名称空间(如果存在)。我使用正则表达式获取名称空间。可能不是最理想的解决方案。但目前看来,它似乎奏效了。谢谢你的帮助!这在原则上看起来是正确的,但是如果OP必须使用ElementTree,那么它将无法工作(此模块仅支持)。它应该与支持完整XPath(1.0)的应用程序一起使用。
/*[local-name()='foo']/*[local-name()='bar']/*[local-name()='baz']