在ElementTree中抑制名称空间

时间:2015-09-13 05:27:26

标签: python xml elementtree

给出一个如下所示的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()方法中。

我已经尝试使用替换来传递https://stackoverflow.com/a/15641319/338479中建议的所有xmlns:属性(如果我找不到更优雅的东西,这可能是我必须要做的),以及我试过调用ElementTree.register_namespace('', "http://example.com/ns"),但这似乎只对ElementTree.tostring()有帮助,这不是我想要的。

是不是只有某种方法让ElementTree假装它从未听说过xmlns

假设即使没有命名空间限定符,我的元素标记也是全局唯一的。在这种情况下,名称空间只会妨碍。

详细解决一些意见:

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'})
  • 预处理输入XML并从输入中剥离xmlns属性,如上所述。
  • 对解析后的文档进行后处理,并从标记中删除所有名称空间。
    • 坦率地说,我最喜欢这种方法。我将发布代码作为答案。
  • 使用register_namespace("", "http://example.com/ns")
    • 这会在使用ElementTree.tostring(el)但不在el.tag中时禁止命名空间。我希望它也无法帮助find()findall()
    • 同样,这并没有解决我需要提前知道所有命名空间的问题(或以某种方式从文档中提取它们)。

0 个答案:

没有答案