при использовании инструментов XML запаса Python такой как xml.dom.minidom
для записи XML файл всегда начинался бы как
<?xml version="1.0"?>
[...]
В то время как это - совершенно легальный код XML, и даже рекомендуется использовать заголовок, я хотел бы избавиться от него как одна из программ, с которыми я работаю, имеет проблемы здесь.
Я, может казаться, не нахожу подходящий вариант в xml.dom.minidom
, таким образом, я задался вопросом, существуют ли другие пакеты, которые действительно позволяют пропускать заголовок.
Удачи,
Nico
К сожалению 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
, которая полностью поддерживает стандарты, но совсем не быстро.
Пуристам может не понравиться это слышать, но я обнаружил, что использование анализатора XML для генерации XML является излишним. Просто сгенерируйте его прямо как строки. Это также позволяет создавать файлы большего размера, чем вы можете хранить в памяти, чего нельзя сделать с помощью DOM. Другое дело - чтение XML.
Если вы решили использовать minidom, просто отсканируйте файл и удалите первую строку после записи всего необходимого XML.
Возможно, вы сможете использовать пользовательский файлоподобный объект, который удаляет первый тег, например:
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-файлы довольно большие.