首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用xml.etree保留命名空间

使用xml.etree保留命名空间
EN

Stack Overflow用户
提问于 2020-06-02 03:38:34
回答 1查看 133关注 0票数 0

在源文件的根元素中定义命名空间时,lxml会在输出中重新生成所有命名空间。我需要和xml.etree一起做这个。更好的做法是只输出所使用的内容,但xml.etree不能找到所有内容。

一种解决方案是使用root.set()强制添加名称空间。但是,这会复制xml.etree找到的所有名称空间,如下所示。

适用于在命令提示符中粘贴的完整示例:

代码语言:javascript
复制
import xml.etree.ElementTree as ET
try:
    from io import StringIO
except ImportError:
    from StringIO import StringIO

def get_namespaces(sourcestring):
    sourcefile = StringIO(sourcestring)
    return dict(
        [node for _, node in ET.iterparse(sourcefile, events=['start-ns'])])

ET._namespace_map = dict()  # remove any previously registered namespaces
sourcetext = (
    '<desc xmlns="uri_a" xmlns:b="uri_b" xmlns:c="uri_c"'
    ' b:foo="c:bar">a</desc>')
source = ET.fromstring(sourcetext)
namespaces = get_namespaces(sourcetext)
for prefix, uri in namespaces.items():
    ET.register_namespace(prefix, uri)
    if prefix:
        tag = 'xmlns:' + prefix
    else:
        tag = 'xmlns'
    source.set(tag, uri)

print(ET.tostring(source, encoding='unicode'))

结果,导致我的应用程序失败:

代码语言:javascript
复制
<desc xmlns="uri_a" xmlns:b="uri_b" xmlns="uri_a" xmlns:b="uri_b" xmlns:c="uri_c" b:foo="c:bar">a</desc>

这类似于Forcing xml.etree to output "unused" namespaces,但是名称空间来自源文件,因此Python代码不知道它们。

EN

回答 1

Stack Overflow用户

发布于 2020-06-02 03:38:34

首先,在不添加缺少的名称空间的情况下生成输出。从该输出中获取找到的名称空间。然后,通过添加未找到的名称空间来生成最终输出。

代码语言:javascript
复制
def add_namespaces_not_found(root):
    result_with_namespaces_found = ET.tostring(root, encoding='unicode')
    namespaces_found = get_namespaces(result_with_namespaces_found)
    for prefix, uri in namespaces.items():
        if prefix not in namespaces_found:
            if prefix:
                tag = 'xmlns:' + prefix
            else:
                tag = 'xmlns'
            root.set(tag, uri)

结果:

代码语言:javascript
复制
<desc xmlns="uri_a" xmlns:b="uri_b" xmlns:c="uri_c" b:foo="c:bar">a</desc>

欢迎不需要生成两次输出的解决方案。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62139743

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档