继承根命名空间映射的增量XML生成

2024-06-16 18:30:57 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在使用LXML的incremental XML generation构建一个大型XML文件。我需要对一些定义为根元素一部分的子元素应用一个名称空间(rss),但是似乎增量XML生成特性提供的上下文管理器没有将根名称空间映射传递给子节点。举个例子:

from lxml import etree

FILENAME = "somefile.xml"
NSMAP = {"myns": "http://example.com/"}

with open(FILENAME, "wb") as f:
    # create XML streamer
    with etree.xmlfile(f) as xf:
        # root element
        with xf.element("root", version="1.0", nsmap=NSMAP):
            with xf.element("channel"):
                title = etree.Element("{http://example.com/}title", nsmap=NSMAP)
                title.text = "some text"
                xf.write(title)

这将生成以下XML文件:

<root xmlns:myns="http://example.com/" version="1.0">
    <channel>
        <myns:title xmlns:myns="http://example.com/">some text</myns:title>
    </channel>
</root>

在上面的例子中,xmlns:myns属性设置了两次,都是在roottitle上。理想情况下,只在根节点上定义一次:

<root xmlns:myns="http://example.com/" version="1.0">
    <channel>
        <myns:title>some text</myns:title>
    </channel>
</root>

通常,在构建XML文档时,只需使用etree.SubElement将根节点传递给子节点,这样子元素就可以查找根命名空间映射,但在这种情况下,上下文管理器似乎可以防止这种情况发生。在使用增量XML生成时,有没有一种方法可以实现这一点


Tags: textcomhttp元素节点titleexamplewith