使用ElementTree忽略命名空间来提取子XML

时间:2018-03-13 13:17:22

标签: python xml xml-parsing elementtree

我有以下XML,如果名称与“Adam”匹​​配,我想提取孩子的一部分

<data>
    <a:config version="1.0" xmlns:a="uri:abc.com/a" xmlns:b="uri:abc.com/b">
  <a:xxx config="ABC">
      <set>option_on</set>
      <location>/123/123</location>
      <data>123</data>
  </a:xxx>
<a:xxx name="Adam">
  <a:yyy value="5555-5555">
    <log>true</log>
  </a:yyy>
</a:xxx>
  <a:xxx name="Lisa">
    <a:yyy value="2222-2222">
      <log>false</log>
    </a:yyy>
  </a:xxx>
</a:config>
</data>

我设法提取该部分,但它不输出原始命名空间,而是显示ns0和ns1。以下是我的代码

import xml.etree.ElementTree as ET
tree2 = ET.parse("mycode.xml")
root2= tree2.getroot()
for elem in tree2.iter(tag='{uri:abc.com/a}xxx'):
  match = elem.get('name')
  if match == "Adam":
    bla = ET.dump(elem)

输出如下: -

<ns0:xxx xmlns:ns0="uri:abc.com/a" name="Adam">
    <ns0:yyy value="5555-5555">
      <log>true</log>
    </ns0:yyy>
  </ns0:xxx>

我希望完全像原始文件一样: -

<a:xxx name="Adam">
  <a:yyy value="5555-5555">
    <log>true</log>
  </a:yyy>
</a:xxx>

1 个答案:

答案 0 :(得分:2)

使用register_namespace功能。

import xml.etree.ElementTree as ET

tree2 = ET.parse("mycode.xml")
root2 = tree2.getroot()

# Register the 'a' prefix to be used when serializing
ET.register_namespace("a", "uri:abc.com/a")

for elem in tree2.iter(tag='{uri:abc.com/a}xxx'):
    match = elem.get('name')
    if match == "Adam":
        bla = ET.dump(elem)

输出:

<a:xxx xmlns:a="uri:abc.com/a" name="Adam">
  <a:yyy value="5555-5555">
    <log>true</log>
  </a:yyy>
</a:xxx>

这不是您要求的确切输出。你不能强制ElementTree省略命名空间声明(因为这样做会使输出格式错误)。