Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/293.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用comment-Python从XML中删除名称空间_Python_Xml_Lxml - Fatal编程技术网

使用comment-Python从XML中删除名称空间

使用comment-Python从XML中删除名称空间,python,xml,lxml,Python,Xml,Lxml,这个问题是这个答案的后续问题: 我正在尝试从XML文件中删除名称空间。当XML中没有注释时,链接的答案可以正常工作。但是,如果有注释,将抛出一个错误 这是我的代码示例: from lxml import etree input_xml = ''' <package xmlns="http://apple.com/itunes/importer"> <provider>some data <!-- example comment--> </provi

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

我正在尝试从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())
从lxml导入etree
输入xml=“”
一些数据
欧洲标准
'''
root=etree.fromstring(输入xml)
#删除名称空间前缀
对于root.getiterator()中的元素:
elem.tag=etree.QName(elem.localname)
#删除未使用的命名空间声明
etree.cleanup\u名称空间(根)
打印(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)

“我试图从XML文件中删除名称空间。”这总是可疑的,很少是一个好主意(或必要的)。你为什么要这样做?我正在尝试执行简单的输出(此时不从XML中提取任何信息),我不想使用名称空间。不确定我是否得到了。。。?没有提取信息的简单输出?我的意思是,直接修改XML不会给我带来任何问题,因为我只是显示XML的某些部分,而没有从中解析/提取信息。所以修改它不会是一个问题。谢谢!这适用于原始代码。但我有一个问题,当有额外的名称空间,他们没有全部被删除。请看一下我编辑的问题好吗?在第二个示例中,您有一个绑定到名称空间的属性(
xsi:schemaLocation
)。如果不希望文档中有任何名称空间声明,则需要删除此属性。有没有办法通过代码而不是手动修改XML?