【发布时间】:2023-08-13 14:16:01
【问题描述】:
给定一个如下所示的 xml 文件:
<?xml version="1.0" encoding="windows-1252"?>
<Message xmlns="http://example.com/ns" xmlns:myns="urn:us:gov:dot:faa:aim:saa">
<foo id="stuffid"/>
<myns:bar/>
</Message>
当我用 ElementTree 解析它时,元素标签看起来像:
{http://example.com/ns}Message
{http://example.com/ns}foo
{urn:us:gov:dot:faa:aim:saa}bar
但我宁愿只拥有
Message
foo
bar
更重要的是,我宁愿只将“Message”、“foo”和“bar”传递给find() 和findall() 方法。
我已经尝试使用替换来审查 xmlns: 中建议的所有 https://*.com/a/15641319/338479 属性(如果我找不到更优雅的东西,这可能是我必须做的),我已经尝试过打电话给ElementTree.register_namespace('', "http://example.com/ns"),但这似乎只对ElementTree.tostring()有帮助,这不是我想要的。
难道没有办法让 ElementTree 假装从未听说过xmlns?
假设我的元素标签是全局唯一的,即使没有命名空间限定符。在这种情况下,命名空间只是碍事。
详细介绍一些cmets:
Joe 链接到Python ElementTree module: How to ignore the namespace of XML files to locate matching element when using the method "find", "findall",这与我的问题非常接近,我猜我的问题是重复的。然而,这个问题也没有得到回答。那里给出的建议是:
- 使用
tree.findall("xmlns:DEAL_LEVEL/xmlns:PAID_OFF", namespaces={'xmlns': 'http://www.test.com'})。- 我在 https://docs.python.org/2/library/xml.etree.elementtree.html#xml.etree.ElementTree.Element.findall 中找不到带有这些参数的调用的文档,无论如何它要求我知道所有的命名空间。
- 如上所述预处理输入 XML 并从输入中去除 xmlns 属性。
- 对已解析的文档进行后处理,并从标签中去除所有命名空间。
- 坦率地说,我最喜欢这种方法。我将发布代码作为答案。
- 使用
register_namespace("", "http://example.com/ns")- 这会在使用
ElementTree.tostring(el)而在el.tag中抑制命名空间。我希望它对find()或findall()也没有帮助。 - 同样,这并不能解决我需要提前知道所有命名空间(或以某种方式从文档中提取它们)的问题。
- 这会在使用
【问题讨论】:
-
是的,它是一个骗局。只需将 xmlns 属性的值设置为空字符串,如上面评论中的 URL 所示。
-
我已经编辑了我的帖子并解决了这些 cmets。感谢您的链接。
标签: python xml elementtree