此问题是此答案的后续措施: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>
更改标签之前,请确保该节点不是注释。下面的代码还删除了名称空间中的所有属性。
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)