从 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)
这个问题是这个答案的后续问题:
我正在尝试从 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)