2011-02-23 5 views
10

Après avoir lu à partir d'un fichier existant avec XML «laid» et faire quelques modifications, jolie impression ne fonctionne pas. J'ai essayé etree.write(FILE_NAME, pretty_print=True).Python jolie imprimante XML avec lxml

J'ai le code XML suivant:

<testsuites tests="14" failures="0" disabled="0" errors="0" time="0.306" name="AllTests"> 
    <testsuite name="AIR" tests="14" failures="0" disabled="0" errors="0" time="0.306"> 
.... 

Et je l'utiliser comme ceci:

tree = etree.parse('original.xml') 
root = tree.getroot() 

...  
# modifications 
... 

with open(FILE_NAME, "w") as f: 
    tree.write(f, pretty_print=True) 

Répondre

33

Pour moi, cette question n'a pas été résolu jusqu'à ce que je remarqué cette petite friandise ici:

http://lxml.de/FAQ.html#why-doesn-t-the-pretty-print-option-reformat-my-xml-output

Version courte:

Lire dans le fichier avec cette commande:

>>> parser = etree.XMLParser(remove_blank_text=True) 
>>> tree = etree.parse(filename, parser) 

qui « reset » l'empreinte déjà existante, ce qui permet la sortie de générer son propre indentation correctement. Puis pretty_print comme d'habitude:

>>> tree.write(<output_file_name>, pretty_print=True) 
6
fp = file('out.txt', 'w') 
print(e.tree.tostring(...), file=fp) 
fp.close() 
+0

Qu'est-ce que e.tree? –

7

Eh bien, selon le API docs, il n'y a pas de méthode "écriture" dans la Module lxml etree. Vous avez quelques options en ce qui concerne l'obtention d'une chaîne de caractères XML dans un fichier. Vous pouvez utiliser la méthode ToString comme ceci:

f = open('doc.xml', 'w') 
f.write(etree.tostring(root, pretty_print=True)) 
f.close() 

Ou, si votre source d'entrée est moins que parfait et/ou si vous voulez plus de boutons et boutons pour configurer à vous mettre pouvez utiliser l'un des emballages de python pour la bien rangé lib.

http://utidylib.berlios.de/

import tidy 
f.write(tidy.parseString(your_xml_str, **{'output_xml':1, 'indent':1, 'input_xml':1})) 

http://countergram.com/open-source/pytidylib

from tidylib import tidy_document 
document, errors = tidy_document(your_xml_str, options={'output_xml':1, 'indent':1, 'input_xml':1}) 
f.write(document) 
2

Je ne suis pas sûr pourquoi d'autres réponses n'ont pas mentionné ceci. Si vous voulez obtenir la racine du xml, il existe une méthode appelée getroot(). J'espère avoir répondu à votre question (avec un peu de retard).

tree = et.parse(xmlFile) 
root = tree.getroot()