【问题标题】:Remove namespace from XML with comment - Python从带有注释的 XML 中删除命名空间 - Python
【发布时间】:2020-03-02 10:09:40
【问题描述】:

这个问题是这个答案的后续:https://stackoverflow.com/a/51972010/3480297

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

这是我的代码示例:

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>

【问题讨论】:

  • “我正在尝试从 XML 文件中删除名称空间。” 这总是可疑的,而且很少是一个好主意(或必要的)。你为什么要这么做?
  • 我正在尝试执行简单的输出(此时没有专门从 XML 中提取任何信息)并且我不想拥有命名空间。
  • 不确定我是否明白...?没有提取信息的简单输出?
  • 我的意思是直接修改 XML 不会给我带来任何问题,因为我只是显示它的某些部分而不从中解析/提取信息。所以修改它不会有问题。

标签: python xml lxml


【解决方案1】:

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

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)

【讨论】:

  • 谢谢!这适用于原始代码。但是当有额外的命名空间并且它们并没有全部被删除时,我遇到了一个问题。你能看看我编辑的问题吗?
  • 在第二个示例中,您有一个绑定到命名空间 (xsi:schemaLocation) 的属性。如果您不希望文档中有任何命名空间声明,则需要删除此属性。
  • 有没有办法用代码做到这一点,而不是手动修改 XML?
猜你喜欢
  • 2020-08-30
  • 2020-10-14
  • 1970-01-01
  • 2020-12-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-17
相关资源
最近更新 更多