испорченный формат при выполнении чтения XML-файла, добавления элементов и записи в файл - PullRequest
1 голос
/ 15 декабря 2011

Использование python, minidom ..

Я читаю довольно отформатированный 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>

1 Ответ

0 голосов
/ 15 декабря 2011

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

Я потратил несколько минут, пытаясь найти параметры конфигурации парсера, доступные с помощьюМинидом посмотрел на исходный код и, честно говоря, я не могу потрудиться посмотреть дальше, поскольку он хорошо задокументирован с использованием 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, это всего лишь быстрый и грязный пример.

...