2016-03-26 2 views
-2

Я пытаюсь создать файл xml в python, чтобы я мог записать его в файл, но у меня возникают сложности с новыми строками и табуляцией и т. Д.Как создать файл xml в python с форматированием

Я не могу использовать модуль для этого, потому что Im использует вырезанную версию python 2. Все должно быть в чистом питоне.

Например, как создать файл xml с этим типом форматирования, который сохраняет все новые строки и вкладки (пробелы)?

например.

<?xml version="1.0" encoding="UTF-8"?> 
<myfiledata> 
    <mydata> 
      blahblah 
    </mydata> 
</myfiledata> 

Я попытался заключая каждую строку

' <myfiledata>' +\n 
'    blahblah' +\n 

и т.д.

Однако выход Im получение из сценария нет ничего близко к тому, как он выглядит в моем файле питона, там это дополнительное пустое пространство, и новые линии arent должным образом работают.

Есть ли какой-либо окончательный способ сделать это? Я предпочел бы редактировать файл, который выглядит примерно так, как в конечном итоге - для ясности ...

+0

Посмотрите на [ '' 'lxml'''] (https://pypi.python.org/pypi/lxml) и посмотреть, не поможет ли он вам. – wwii

+0

Извините, я обновил ответ, я не могу использовать lxml, его нужно быть чистым python. –

+2

Возможно, вам понадобится многострочная строка. Для некоторых идей см. Этот http://stackoverflow.com/questions/2504411/proper-indentation-for-python-multiline-strings. –

ответ

1

Вы можете использовать XMLGenerator из saxutils для генерации XML и xml.dom.minidom, чтобы разобрать его и распечатать симпатичный xml (оба модули из стандартной библиотеки в Python 2).

Пример кода создания XML и довольно-печатью:

from __future__ import print_function 
from xml.sax.saxutils import XMLGenerator 
import io 
import xml.dom.minidom 

def pprint_xml_string(s): 
    """Pretty-print an XML string with minidom""" 
    parsed = xml.dom.minidom.parse(io.BytesIO(s)) 
    return parsed.toprettyxml() 

# create a XML file in-memory: 
fp = io.BytesIO() 
xg = XMLGenerator(fp) 

xg.startDocument() 
xg.startElement('root', {}) 

xg.startElement('subitem', {}) 
xg.characters('text content') 
xg.endElement('subitem') 

xg.startElement('subitem', {}) 
xg.characters('text content for another subitem') 
xg.endElement('subitem') 

xg.endElement('root') 
xg.endDocument() 

# pretty-print it 
xml_string = fp.getvalue() 
pretty_xml = pprint_xml_string(xml_string) 
print(pretty_xml) 

Выход:

<?xml version="1.0" ?> 
<root> 
    <subitem>text content</subitem> 
    <subitem>text content for another subitem</subitem> 
</root> 

Обратите внимание, что элементы содержания текста (завернутые в <subitem> тегах) не отступом, потому что делать поэтому изменение их содержимого (XML не игнорирует пробелы, как это делает HTML).

+0

Не работает в python 2.5.2 im fear –

+1

@Ke. В следующий раз, пожалуйста, укажите это требование в вашем вопросе. – elias

0

Ответ был использовать xml.element.tree и от xml.dom импорта minidom

Что все имеющиеся на питона 2,5