如何从根元素属性在Python XML etree的ElementTree(How to remov

2019-09-27 17:49发布

我的文件包含以下数据:

原版的:

<?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来解析文件,我想从根元素“网址设定”属性

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)

我想我应该得到{的xmlns:“ http://www.sitemaps.org/schemas/sitemap/0.9 ”}当我打印root.attrib第一次,但我有一个空的字典。 有人能帮忙吗?

不胜感激!

Answer 1:

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

删除,添加或修改命名空间可以是相当困难的。 “正常”的属性被存储在一个元素的可写attrib财产。 在另一方面命名空间的映射不通过API容易获得(在lxml的图书馆,元素确实有nsmap属性,但它是只读的)。

我建议一个简单的文本搜索和替换操作,类似于答案与LXML给定的XML文档中修改的命名空间 。 事情是这样的:

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)

另请参阅如何插入的命名空间和前缀与Python的XML字符串? 。



Answer 2:

在标准库xml.etree.ElementTree没有要删除属性特别的方法,但所有的属性被存储在一个attrib这是一个dict和任何属性可以从被删除attrib作为从密钥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>'


文章来源: How to remove attribute from root element in Python xml etree ElementTree