2010-04-22 6 views
1

Y a-t-il un moyen autre que de créer moi-même une méthode pour écrire du code XML en utilisant python qui sont facilement lisibles? xMLFile.write (xmlDom.toxml()) crée un fichier XML approprié mais il est assez difficile de les lire. J'ai essayé toprettyxml mais n'a pas l'air de faire beaucoup. par exemple. Ce qui suit est ce que je considère un xml lisible: résuméÉcrire en XML facilement lisibles en Python

<myroot> 
    <ent1 
     att1="val1" 
     att2="val2" 
     att3="val3" 
    /> 
    <ent2> 
     <ent3 
      att1="val1" 
      att2="val2" 
     /> 
    </ent2> 
</myroot> 

Solutions des réponses ci-dessous:
1) Si vous avez juste besoin de occassionaly lire pour le débogage puis au lieu de formater le xml lors de l'écriture xmllint d'utilisation ou un éditeur XML pour le lire. Ou
2) Utilisez une bibliothèque comme Beautiful Soup. Ou
3) Écrivez votre propre méthode

+0

Qu'est-ce qui, à votre avis, rend un fichier XML "lisible"? Le terme est très ambigu. – Oded

+0

Excuses. Je suis en train d'essayer de coller un exemple. Juste besoin de trier comment mettre en indentation onglet en utilisant le balisage. – dutch

+1

Voulez-vous simplement cela pour un débogage plus facile? Je me trouve en utilisant le programme "xmllint", avec l'option "--format" pour lancer ma sortie quand je veux le lire. –

Répondre

0

Malheureusement, la lisibilité XML par les humains n'était pas un objectif de conception. Au contraire, BeautifulStoneSoup fait un effort pour prétendre XML. Ce n'est pas génial, mais c'est mieux que rien. Écrivez votre propre méthode de formatage du document xml.

0

Par exemple, cela produira le format de votre exemple chaîne XML:

rep={" ":" \n", 
    "/>":"\n/>"} 

outStr=xmlDom.toxml() 

for k in rep: 
     outStr=outStr.replace(k, rep[k]) 
6
print lxml.etree.tostring(root_node, pretty_print=True) 
1

Si vous utilisez ce code elementalTree fonctionnera.

XMLtext= ET.tostringlist(root) 
OutputStr='' 
level=-1 

for t in XMLtext: 

    if t[0]=='<': 
      level=level+1 
    if t[0:2]=='</': 
      #remove the added level because of '<' 
     level=level-1 

    if t[-1]=='"' or t[0]=='<' or t[-2:]=='/>': 
     t="\n"+" "*level+t 

    if t[-2:]=='/>' or t[level*4+1:level*4+3]=='</': #end of block 
     level=level-1 

    if t[-1:]=='>':  
     t=t+'\n' 


    OutputStr=OutputStr+t 

f = open("test.xml", "w") 
f.write(OutputStr) 
f.close() 
0

Je pense que la meilleure façon de le faire, en utilisant des batteries inclus python est la donnée dans cette réponse: https://stackoverflow.com/a/1206856.

import xml.dom.minidom 

xml = xml.dom.minidom.parse(xml_fname) # or xml.dom.minidom.parseString(xml_string) 
pretty_xml_as_string = xml.toprettyxml()