Проблема при создании XML-файла из Python Minidom - PullRequest
0 голосов
/ 19 марта 2012

Вот код:

    from xml.dom.minidom import Document

doc = Document()
root = doc.createElement('root')
doc.appendChild(root)
for i in range(1,3):
    main = doc.createElement('item class:=memory')
    root.appendChild(main)
    for j in range(1,3):
        text = doc.createTextNode('DIMM Size'+str(j))
        main.appendChild(text)

print (doc.toprettyxml(indent='\t'))

Вот вывод:

     <?xml version="1.0" ?>
<root>
    <item class:=memory>
        DIMM Size1
        DIMM Size2
    </item class:=memory>
    <item class:=memory>
        DIMM Size1
        DIMM Size2
    </item class:=memory>
</root>

Я пытаюсь создать файл со следующим кодом. Есть ли способ сгенерировать следующий вывод:

<root>
    <item class:=memory>
        <p> DIMM Size1 </p>
        <p>DIMM Size2 </p>
    </item>
    <item class:=memory>
        <p>DIMM Size1</p>
        <p>DIMM Size2</p>
    </item>
</root>

1 Ответ

2 голосов
/ 19 марта 2012

Вам нужно два быстрых изменения

  1. Создание элемента p, например doc.createElement('p')
  2. Не устанавливайте атрибуты вручную, вместо этого используйте node.attributes, например main.attributes['class']='memory'

, поэтому ваш код должен выглядеть следующим образом

from xml.dom.minidom import Document

doc = Document()
root = doc.createElement('root')
doc.appendChild(root)
for i in range(1,3):
    main = doc.createElement('item')
    main.attributes['class']='memory'
    root.appendChild(main)
    for j in range(1,3):
        p = doc.createElement('p')
        text = doc.createTextNode('DIMM Size'+str(j))
        p.appendChild(text)
        main.appendChild(p)

print (doc.toprettyxml(indent='\t'))

Долгосрочное изменение будет заключаться в использовании ElementTree , который имеет более интуитивно понятный интерфейс и прост в использовании, болеепоэтому при чтении xml, например, ваш пример в дереве элементов

from xml.etree import cElementTree as etree

root = etree.Element('root')
for i in range(1,3):
    item = etree.SubElement(root, 'item')
    item.attrib['class']='memory'
    for j in range(1,3):
        p = etree.SubElement(item, 'p')
        p.text = 'DIMM Size %s'%j

print etree.tostring(root)
...