pythonxml以增量方式编写XML而不复制名称空间

2024-10-01 07:36:19 发布

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

当我使用lxml以增量方式编写XML时,我想知道是否有一种方法可以对XML进行简洁的命名空间声明。目前,我通过生成XML的方式得到了重复的名称空间。请参见下面的内容,其中标记dataoneEntry复制了名称空间:

<?xml version='1.0' encoding='utf-8'?>
<data xmlns="nsURI1" xmlns:second="nsURI2">
    <oneEntry xmlns:second="nsURI2" xmlns="nsURI1">
        <subEntry1/>
        <second:subEntry2/>
    </oneEntry>
</data>

这可以由这样的脚本生成(灵感来自http://lxml.de/api.html#incremental-xml-generation

from lxml import etree
from io import BytesIO

class XmlWriter(object):
    ROOT_TAG = 'data'
    ENCODING = 'utf-8'
    NSMAP = {
        None: 'nsURI1',
        'second': 'nsURI2'
    }

    def write(self):
        f = BytesIO()
        w = self.writer(f)  # Creates the writer
        next(w)  # Start writing (go to first yield)

        element = etree.Element('oneEntry', nsmap=self.NSMAP)
        etree.SubElement(element, '{nsURI1}subEntry1')
        etree.SubElement(element, '{nsURI2}subEntry2')
        w.send(element)

        w.close() # Closing stream closes root tag
        print(f.getvalue().decode('utf-8'))

    @classmethod
    def writer(cls, out_stream):
        with etree.xmlfile(out_stream, encoding=cls.ENCODING) as xf:
            xf.write_declaration()
            with xf.element(cls.ROOT_TAG, nsmap=cls.NSMAP):
                while True:
                    el = yield
                    xf.write(el)
                    xf.flush()

XmlWriter().write()

计算一个条目的部分实际上是一个生成数千个条目的循环,因此我需要一个流。 现在,我明白为什么会这样。计算entry元素的部分不知道streamwriter中的根标记。因此,在增量写入过程中,名称空间在每个条目上都是重复的。这将增加(当文件未压缩时)输出的大小。你知道吗

你知道我如何仍然可以增量地编写我的XML,而不必改变它的结构,并且仍然最好使用lxml吗?你知道吗

非常感谢!你知道吗


Tags: data空间xmlelementlxml增量writecls