Как записать XML-файл без заголовка в Python?

при использовании инструментов XML запаса Python такой как xml.dom.minidom для записи XML файл всегда начинался бы как

<?xml version="1.0"?>

[...]

В то время как это - совершенно легальный код XML, и даже рекомендуется использовать заголовок, я хотел бы избавиться от него как одна из программ, с которыми я работаю, имеет проблемы здесь.

Я, может казаться, не нахожу подходящий вариант в xml.dom.minidom, таким образом, я задался вопросом, существуют ли другие пакеты, которые действительно позволяют пропускать заголовок.

Удачи,

Nico

7
задан Nico Schlömer 29 May 2010 в 00:28
поделиться

4 ответа

К сожалению minidom не дает вам возможности опустить объявление XML.

Но вы всегда можете сериализовать содержимое документа самостоятельно, вызвав toxml () в корневом элементе документа вместо документа . Тогда вы не получите XML-декларацию:

xml= document.documentElement.toxml('utf-8')

... но тогда вы также не получите ничего, кроме корневого элемента, такого как DOCTYPE, или каких-либо комментариев или инструкций по обработке. Если они вам нужны, сериализуйте каждый дочерний объект объекта документа один за другим:

xml= '\n'.join(node.toxml('utf-8') for node in document.childNodes)

Мне было интересно, есть ли другие пакеты, которые позволяют игнорировать заголовок.

DOM Level 3 LS определяет параметр конфигурации xml-декларация , который можно использовать для его подавления. Единственная известная мне реализация Python - это pxdom , которая полностью поддерживает стандарты, но совсем не быстро.

15
ответ дан 6 December 2019 в 09:18
поделиться

Пуристам может не понравиться это слышать, но я обнаружил, что использование анализатора XML для генерации XML является излишним. Просто сгенерируйте его прямо как строки. Это также позволяет создавать файлы большего размера, чем вы можете хранить в памяти, чего нельзя сделать с помощью DOM. Другое дело - чтение XML.

0
ответ дан 6 December 2019 в 09:18
поделиться

Если вы решили использовать minidom, просто отсканируйте файл и удалите первую строку после записи всего необходимого XML.

0
ответ дан 6 December 2019 в 09:18
поделиться

Возможно, вы сможете использовать пользовательский файлоподобный объект, который удаляет первый тег, например:

class RemoveFirstLine:
    def __init__(self, f):
        self.f = f
        self.xmlTagFound = False

    def __getattr__(self, attr):
        return getattr(self, self.f)

    def write(self, s):
        if not self.xmlTagFound:
            x = 0 # just to be safe
            for x, c in enumerate(s):
                if c == '>':
                    self.xmlTagFound = True
                    break
            self.f.write(s[x+1:])
        else:
            self.f.write(s)

...
f = RemoveFirstLine(open('path', 'wb'))
Node.writexml(f, encoding='UTF-8')

или что-то подобное. Это имеет преимущество в том, что файл не нужно полностью переписывать, если XML-файлы довольно большие.

0
ответ дан 6 December 2019 в 09:18
поделиться
Другие вопросы по тегам:

Похожие вопросы: