2016-06-22 11 views
0

Ich versuche, Daten aus mehreren Listen im XML-Format zu speichern, aber ich kann nicht verstehen, wie Sie die XML-Anzeige richtig machen. Ein Beispiel für meinen Code jetzt wie folgt:Erstellen ordnungsgemäß verschachtelter XML-Ausgabe in Python

from lxml import etree 

#Create XML Root 
articles = etree.Element('root') 

#Create Lists & Data 
t_list = ['title1', 'title2', 'title3', 'title4', 'title5'] 
c_list = ['content1', 'content2', 'content3', 'content4', 'content5'] 
sum_list = ['summary1', 'summary2', 'summary3', 'summary4', 'summary5'] 
s_list = ['source1', 'source2', 'source3', 'source4', 'source5'] 

i = 0 
for t in t_list: 
    for i in range(len(t_list)): 
     #Create SubElements of XML Root 
     article = etree.SubElement(articles, 'Article') 
     titles = etree.SubElement(article, 'Title') 
     summary = etree.SubElement(article, 'Summary') 
     source = etree.SubElement(article, 'Source') 
     content = etree.SubElement(article, 'Content') 

     #Add List Data to SubElements 
     titles.text = t_list[i] 
     summary.text = sum_list[i] 
     source.text = s_list[i] 
     content.text = c_list[i] 

print(etree.tostring(articles, pretty_print=True)) 

Mein Stromausgang in einem sehr wirre Art und Weise geschrieben, die alle auf einer einzelnen Zeile wie folgt:

b'<root>\n <Article>\n <Title>title1</Title>\n <Summary>summary1</Summary>\n <Source>source1</Source>\n <Content>content1</Content>\n </Article>\n 

Es sieht aus wie die pretty_print Funktion innerhalb lxml fügt richtigen Einzug, sowie \n bricht, wie ich möchte, aber es scheint nicht richtig interpretiert während der Ausgabe; es schreibt auf einer einzigen Zeile.

Die Ausgabe Ich versuche, ist wie folgt zu erhalten:

<root> 
    <Article> 
    <Title>title1</Title> 
    <Summary>summary1</Summary> 
    <Source>source1</Source> 
    <Content>content1</Content> 
    </Article> 

Idealerweise möchte ich für meine Ausgabe in der richtigen verschachtelten Format als gültige XML-Dokument und die Anzeige betrachtet werden.

Antwort

0

Ihr „Stromausgang“ ist die Darstellung (interne Python-Darstellung) des bytestring von etree.tostring() erzeugt, und es scheint, dass in Python3 print(somebytestring) druckt die Darstellung anstelle der tatsächliche Zeichenfolge.

Hoffentlich wird die Lösung ist ganz einfach: nur die desired encoding-etree.tostring() passieren, das heißt:

xml = etree.tostring(articles, encoding="unicode", pretty_print=True) 
print(xml) 
+0

das 'encoding =" unicode "' tat genau das, was ich wollte – theeastcoastwest

0

Ich habe nur das ET-Basismodul in Python verwendet und kann keinen lxml-Download für Python 3.5 finden (auf dem ich bin), um es zu testen, aber die b vor der Zeile zeigt Bytes und Ein kurzer Blick auf die Dokumentation zeigt an, dass tostring() ein Codierungs-Schlüsselwort hat, also sollten Sie es nur auf Unicode oder utf-8 setzen.

Ich werde auch erwähnen, dass Sie nicht setzen müssen "i" vor Ihrer for-Schleife (Python wird das "i" es für die For-Schleife benötigt), obwohl ich persönlich würde zip die Listen und iterieren die Elemente in den Listen selbst (obwohl das in dieser Situation keinen wirklichen Einfluss auf den Code haben wird).

+0

Danke, ich bin neu in Python und unabhängig von Auswirkungen auf die Produktion, ich schätze den Rat. – theeastcoastwest

Verwandte Themen