【问题标题】:Extracting Child XML using ElementTree ignoring Namespace使用 ElementTree 提取子 XML 忽略命名空间
【发布时间】:2018-03-13 13:17:21
【问题描述】:

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

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

【问题讨论】:

  • 问题中的 XML 文档格式不正确。没有声明 ab 命名空间前缀。
  • @mzjn 你是对的。我已经更正了样本数据
  • 我已经用 BeautifulSoup 完成了这个,但是我正在使用的服务器没有安装 bs4。希望有人可以使用 ElementTree 解决这个问题。谢谢

标签: python xml xml-parsing elementtree


【解决方案1】:

使用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 省略命名空间声明(因为这样做会使输出格式错误)。

【讨论】:

    猜你喜欢
    • 2018-10-19
    • 2017-07-08
    • 2011-12-05
    • 2015-02-18
    • 2012-02-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-02
    相关资源
    最近更新 更多