2013-08-11 4 views
4

Je change un certain xml en ajoutant quelques noeuds et valeurs d'une liste. Je peux créer avec succès tous les nouveaux tags et valeurs, je les crée entre les tags des contributeurs, mais quand je sauvegarde le xml dans un nouveau fichier, les tags que je crée sont tous sur une seule ligne. Voici un exemple de mon code:python xml jolie impression ne fonctionne pas

templateXml = """<?xml version="1.0" encoding="utf-8" standalone="yes"?> 
<package> 
    <delivery_type>new</delivery_type> 
    <feature> 
    <feature_type>Movie</feature_type> 
    <contributors> 
    </contributors> 
</package>""" 

from lxml import etree 
tree = etree.fromstring(templateXml) 

node_video = tree.xpath('//feature/contributors')[0] 
for cast in castList: 
    pageElement = etree.SubElement(node_video, 'contributor') 
    node_video1 = tree.xpath('//feature/contributors/contributor')[0] 
    pageElement.attrib['type'] = 'cast' 
    pageElement1 = etree.SubElement(pageElement, 'name') 
    pageElement1.text = cast.text 
    pageElement2 = etree.SubElement(pageElement, 'role') 
    pageElement2.text = "actor" 

xmlFileOut = '/Users/User1/Desktop/Python/Done.xml' 

with open(xmlFileOut, "w") as f: 
    f.write(etree.tostring(tree, pretty_print = True, xml_declaration = True, encoding='UTF-8', standalone="yes")) 

Voici sauvé fichier xml:

<?xml version="1.0" encoding="utf-8" standalone="yes"?> 
<package> 
    <delivery_type>new</delivery_type> 
    <feature> 
    <feature_type>Movie</feature_type> 
    <contributors> 
    <contributor type="cast"><name>John Doe</name><role>actor</role></contributor><contributor type="cast"><name>Another Actors name</name><role>actor</role></contributor><contributor type="cast"><name>Jane Doe</name><role>actor</role></contributor><contributor type="cast"><name>John Smith</name><role>actor</role></contributor></contributors> 
</package> 

J'ai résolu ce problème lors de l'ouverture d'un fichier xml pour travailler en utilisant le code ci-dessous:

from lxml import etree 
parser = etree.XMLParser(remove_blank_text=True) # makes pretty print work 
path3 = 'path_to_xml_file' 
open(path3) 
tree = etree.parse(path3, parser) 
root = tree.getroot() 
tree.write(xmlFileOut, pretty_print = True, xml_declaration = True, encoding = 'UTF-8') 

Cela fonctionne, mais comment puis-je le faire fonctionner avec une chaîne XML?

Répondre

0

Une solution simple pourrait consister à utiliser StringIO:

from StringIO import StringIO 
from lxml import etree 
parser = etree.XMLParser(remove_blank_text=True) 
tree = etree.parse(StringIO(templateXml), parser)