我试图解析一些有时只设置了xmlns的xml文件。有没有办法确定它是否使用lxml库设置?
我的主要问题是当使用find或findall查找元素时,如果由于标记不匹配而设置了命名空间,则不会返回任何内容。但我无法对命名空间进行硬编码,因为有时候没有设置命名空间。我真的不知道如何解决这个问题。
这是我的部分代码
的示例 tree = ET.parse(xml_file_path)
root = tree.getroot() #ONIXmessage
...
pids = product.findall("productidentifier")
...
所以我的主要问题是findall()方法
感谢。
答案 0 :(得分:0)
这有点痛苦,但您可以在XPath中使用local-name()。
例如,而不是:
/foo/bar/baz
尝试:
/*[local-name()='foo']/*[local-name()='bar']/*[local-name()='baz']
答案 1 :(得分:0)
我很快就会遇到这个问题/问题。我的想法是:使用一个首先尝试获取没有指定命名空间的元素的包装函数,如果返回None
,则尝试使用命名空间。如果两者都返回None,则元素不存在。如果没有提供默认命名空间,则使用这两个函数(不使用if-else)可以很好地工作。
如果选择是在指定的同一命名空间之间,那么我认为上面的方法是可以的。如果你有多个可选命名空间,它会使你的包装器更复杂,但它是一次性的。
虽然希望看到一个更优雅的解决方案。 DanielHaley的回答是否有效?
相关选项:
find
,findall
等中指定名称空间也有this个答案。register_namespace
尝试here,这可用于写出来。*
进行查找,但过于通用,无法用于查找特定元素。