从带有注释的XML中删除名称空间-Python

问题描述 投票:1回答:1

此问题是此答案的后续措施:https://stackoverflow.com/a/51972010/3480297

我正在尝试从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:类型类的无效输入标签]

编辑:

如果我具有以下“ 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>
python xml lxml
1个回答
2
投票

更改标签之前,请确保该节点不是注释。下面的代码还删除了名称空间中的所有属性。

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)
© www.soinside.com 2019 - 2024. All rights reserved.