【问题标题】:How to remove attribute from root element in Python xml etree ElementTree如何从 Python xml etree ElementTree 中的根元素中删除属性
【发布时间】:2017-04-16 22:34:36
【问题描述】:

我的文件包含以下数据:

原文:

<?xml version="1.0" encoding="UTF-8"?><urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9"> <url> <changefreq>daily</changefreq> <loc>http://www.example.com</loc></url></urlset>

预期:

<?xml version="1.0" encoding="UTF-8"?><urlset> <url> <changefreq>daily</changefreq> <loc>http://www.example.com</loc></url></urlset>

我使用 etree 来解析文件,我想从根元素 'urlset' 中删除属性

import xml.etree.ElementTree as ET

tree = ET.parse("/Users/hsyang/Downloads/VI-0-11-14-2016_20.xml")
root = tree.getroot()

print root.attrib
>> {}

root.attrib.pop("xmlns", None)

print root.attrib
>> {}
ET.tostring(root)

我以为我第一次打印 root.attrib 时应该得到 {xmlns:"http://www.sitemaps.org/schemas/sitemap/0.9"},但我得到了一个空字典。有人可以帮忙吗?

欣赏!

【问题讨论】:

    标签: xml python-2.7 xml-parsing elementtree xml-sitemap


    【解决方案1】:

    xmlns="http://www.sitemaps.org/schemas/sitemap/0.9" 看起来像一个常规属性,但它是一种特殊情况,即命名空间声明。

    删除、添加或修改命名空间可能非常困难。 “正常”属性存储在元素的可写attrib 属性中。另一方面,命名空间映射并不容易通过 API 获得(在 lxml 库中,元素确实具有 nsmap 属性,但它是只读的)。

    我建议一个简单的文本搜索和替换操作,类似于Modify namespaces in a given xml document with lxml 的答案。像这样的:

    with open("input.xml", "r") as infile, open("output.xml", "w") as outfile:
        data = infile.read()
        data = data.replace(' xmlns="http://www.sitemaps.org/schemas/sitemap/0.9"', '')
        outfile.write(data)
    

    另见How to insert namespace and prefixes into an XML string with Python?

    【讨论】:

      【解决方案2】:

      在标准库xml.etree.ElementTree 中没有删除属性的特殊方法,但所有属性都存储在attrib 中,这是一个dict,并且任何属性都可以从attrib 中删除,作为a 中的键dict:

          import xml.etree.ElementTree as ET
      
          tree = ET.parse(file_path)
          root = tree.getroot()      
      
          print(root.attrib)  # {'xyz': '123'}
      
          root.attrib.pop("xyz", None)  # None is to not raise an exception if xyz does not exist
      
          print(root.attrib)  # {}
      
          ET.tostring(root)
          '<urlset> <url> <changefreq>daily</changefreq> <loc>http://www.example.com</loc></url></urlset>'
      

      【讨论】:

      • 我文件中根属性的真正键值实际上是 sitemaps.org/schemas/sitemap/0.9"> 但为简单起见,我将其替换为 xyz="123"。我想知道 xmlns 在 XML 中是否有任何特殊含义,因此在这里它不被视为常规属性键......只是我的非开发人员怀疑。
      • 是的,xmlnsxml 中有特殊含义:w3schools.com/xml/xml_namespaces.asp 所以你要小心删除那个属性
      • 知道了。谢谢!只是想澄清一下-我使用的是xml.etree.ElementTree。我尝试了您建议的两种方法,并且两种方法(.pop,strip_attributes)都引发了错误;我认为在您的示例中,您指的是 lxml.etree。我试图在 xml.etree 中找到任何相同的方法,但找不到任何方法。
      • 你是对的,例子是lxml。更新为xml.etree.ElementTree
      • 但是这个方法不能应用于xmlns,因为xmlns没有存储在attrib属性中。
      猜你喜欢
      • 1970-01-01
      • 2018-04-12
      • 1970-01-01
      • 2016-09-18
      • 2013-09-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多