Python XML - пошаговое написание XML без дублирования пространств имен - PullRequest
0 голосов
/ 14 мая 2018

Мне интересно, есть ли способ получить краткое объявление пространства имен моего XML, когда я пишу его инкрементно, используя lxml.В настоящее время я получаю дублированные пространства имен с тем, как я генерирую свой XML.См. Ниже, где теги data и oneEntry дублируют пространства имен:

<?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.во время инкрементной записи пространства имен дублируются в каждой записи. Это увеличит (когда мой файл не сжат) размер моего вывода.

Любая идея, как я мог бы по-прежнему записывать пошагово мой XML, не имеячтобы изменить его структуру и все еще использовать lxml предпочтительно?

Большое спасибо!

...