формат перепутался при выполнении чтения XML-файла, добавления элементов и записи в файл

Используя питон, минидом..

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

Все работает нормально, кроме формата новых добавленных элементов.

Это выглядит как,

<previousTag>
   .. everything which was already in the xml file is correctly formatted.
   <addedTag1><addedTag2></addedTag2></addedTag1></previousTag>

тогда как я хочу

<previousTag>
  <addedTag1>
     <addedTag2>
     </addedTag2>
  </addedTag1>
</previousTag>

Я попытался преобразовать все это в prettyxml, используя toprettyxml(). Но тогда похоже

<previousTag>
  ..so many unwanted whitespaces inbetween already existing tags..
  <addedTag1>
      <addedTag2>
      </addedTag2>
  </addedTag1>
  ..whitespaces..
</previousTag>

person eugene    schedule 15.12.2011    source источник
comment
У этого парня есть хороший метод исправления безумия пробелов в toprettyxml(): ronrothman.com/public/leftbraned/   -  person Adam Morris    schedule 15.12.2011


Ответы (1)


Вам нужно будет либо удалить пробелы самостоятельно, либо сообщить своему синтаксическому анализатору, чтобы он сделал это за вас (если возможно).

Я потратил несколько минут, пытаясь найти параметры конфигурации синтаксического анализатора, доступные с помощью minidom, просмотрел исходный код и, честно говоря, мне неинтересно смотреть дальше, поскольку он хорошо задокументирован с использованием lxml.etree:

from lxml import etree

sample = """
<previousTag>
  <previousSubElement1>Foo</previousSubElement1>
  <previousSubElement2>Bar</previousSubElement2>
</previousTag>
"""

doc = etree.XML(sample,etree.XMLParser(remove_blank_text=True))
addedTag1 = doc.makeelement('addedTag1')
addedTag2 = doc.makeelement('addedTag2')
addedTag2.text = "Baz"
addedTag1.append(addedTag2)
doc.append(addedTag1)

print etree.tostring(doc,pretty_print=True)

Урожайность:

<previousTag>
  <previousSubElement1>Foo</previousSubElement1>
  <previousSubElement2>Foo</previousSubElement2>
  <addedTag1>
    <addedTag2>Baz</addedTag2>
  </addedTag1>
</previousTag>

Существуют и другие способы изменения объектов XML с помощью lxml.etree, это всего лишь быстрый и грязный пример.

person MattH    schedule 15.12.2011