从 XML 中删除名称空间并附上注释 - Python

Remove namespace from XML with comment - Python

这个问题是这个答案的后续问题:

我正在尝试从 XML 文件中删除命名空间。当 XML 中没有评论时,链接的答案工作正常。但是,如果有评论,则会抛出错误。

这是我的代码示例:

from lxml import etree

input_xml = '''
<package xmlns="http://apple.com/itunes/importer">
  <provider>some data <!-- example comment--> </provider>
  <language>en-GB</language>
</package>
'''
root = etree.fromstring(input_xml)

# Remove namespace prefixes
for elem in root.getiterator():
    elem.tag = etree.QName(elem).localname
# Remove unused namespace declarations
etree.cleanup_namespaces(root)

print(etree.tostring(root).decode())

这将引发以下错误:

ValueError: Invalid input tag of type class <'cython_function_or_method'>

编辑:

如果我有下面的"input_xml"结构,并不是所有的命名空间都被使用下面答案中的代码取出。

<package xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://com/scheme/location/example/ Location.xsd ">
  <provider>some data <!-- example comment--> </provider>
  <language>en-GB</language>
</package>

代码的结果仍然是:

<package xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://com/scheme/location/example/ Location.xsd ">
  <provider>some data <!-- example comment--> </provider>
  <language>en-GB</language>
</package>

在更改标签之前确保该节点不是评论。下面的代码还删除了命名空间中的所有属性。

for elem in root.getiterator():
    # For elements, replace qualified name with localname
    if not(type(elem) == etree._Comment):
        elem.tag = etree.QName(elem).localname

    # Remove attributes that are in a namespace
    for attr in elem.attrib:
        if "{" in attr:
            elem.attrib.pop(attr)