Seite 1 von 1
lxml - xml File unschön
Verfasst: Donnerstag 24. Januar 2008, 10:51
von xraver
Hallo,
sorry für den Topic, doch fiel nichts bessere ein.
Ich habe ein xml File was ich so einlese.
Wenn ich ein Element nun hinzufüge;
Code: Alles auswählen
kind1 = etree.SubElement(x.getroot(), "kind1")
kind2 = etree.SubElement(kind1, "kind2")
und mir nun das xml anschaue, dann ist die Formatierung weg;
Code: Alles auswählen
<Doc>
<altes_element />
<noch_ein_altes />
<kind1><kind2/></kind1></Doc>
Wieso ist der alte Inhalt der xml Datei formatiert und der neue hinzugefügte nicht? Und wie löse ich das Problem

.
Danke...
Verfasst: Donnerstag 24. Januar 2008, 11:14
von BlackJack
Erst einmal müsstest Du noch einen Anlauf machen das Problem zu zeigen. Diesmal bitte mit echten Daten und nicht "gefälschten" Ausgaben. Die Ausgabe da ist nicht von `lxml` oder nicht so entstanden wie Du behauptest. Die alten Knoten sind zu weit eingerückt und die Leerzeichen zwischen altem Tag-Namen und '/' dürften da nicht sein.
Code: Alles auswählen
In [124]: a = etree.XML('<Doc><altes_element /><noch_ein_altes /></Doc>')
In [125]: kind1 = etree.SubElement(a, 'kind1')
In [126]: kind2 = etree.SubElement(kind1, 'kind2')
In [127]: print etree.tostring(a, pretty_print=True)
<Doc>
<altes_element/>
<noch_ein_altes/>
<kind1>
<kind2/>
</kind1>
</Doc>
Verfasst: Donnerstag 24. Januar 2008, 12:10
von xraver
BlackJack hat geschrieben:Erst einmal müsstest Du noch einen Anlauf machen das Problem zu zeigen. Diesmal bitte mit echten Daten und nicht "gefälschten" Ausgaben.
N dann

....
Code: Alles auswählen
>>> x = etree.parse('/tmp/out.xml')
>>> print etree.tostring(x, pretty_print=True)
Code: Alles auswählen
<IS24ImmobilienTransfer xmlns="http://www.immobilienscout24.de/immobilientransfer" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.immobilienscout24.de/immobilientransfer is24immotransfer.xsd" EmailBeiFehler="rootdesign@gmail.com" ErstellerSoftware="node_to_xml.py" ErstellerSoftwareVersion="0.01">
<Anbieter ScoutKundenID="30302">
</Anbieter>
</IS24ImmobilienTransfer>
Code: Alles auswählen
>>> kind1 = etree.SubElement(x.getroot(), "kind1")
>>> kind2 = etree.SubElement(kind1, "kind2")
>>> print etree.tostring(x, pretty_print=True)
Code: Alles auswählen
<IS24ImmobilienTransfer xmlns="http://www.immobilienscout24.de/immobilientransfer" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.immobilienscout24.de/immobilientransfer is24immotransfer.xsd" EmailBeiFehler="rootdesign@gmail.com" ErstellerSoftware="node_to_xml.py" ErstellerSoftwareVersion="0.01">
<Anbieter ScoutKundenID="30302">
</Anbieter>
<kind1><kind2/></kind1></IS24ImmobilienTransfer>
Das Ergebnis ist das gleiche

. Die Hinzugefügten Elemente sind nicht formatiert. Desweiteren würde mich interessieren wie ich gleich auf Element "Anbieter" zugreifen kann um dort Elemente einzufügen.
Verfasst: Donnerstag 24. Januar 2008, 13:00
von BlackJack
Anscheinend macht `lxml` kein "pretty printing" wenn so etwas schon in der Quelle war. Das erste was Du siehst ist nämlich nicht von `lxml`, dass heisst die Ausgabe würde mit ``pretty_printing=False`` genau so aussehen.
Code: Alles auswählen
In [149]: a = etree.XML('<Doc>\n <altes_element />\n <noch_ein_altes />\n</Doc>')
In [150]: print etree.tostring(a, pretty_print=False)
<Doc>
<altes_element/>
<noch_ein_altes/>
</Doc>
In [151]: kind1 = etree.SubElement(a, 'kind1')
In [152]: kind2 = etree.SubElement(kind1, 'kind2')
In [153]: print etree.tostring(a, pretty_print=True)
<Doc>
<altes_element/>
<noch_ein_altes/>
<kind1><kind2/></kind1></Doc>
Letztendlich ist "pretty printing" von XML auch nicht so einfach wie es auf den ersten Blick aussieht, weil der "pretty printer" dazu eigentlich wissen muss, wo Textknoten stehen dürfen und wo nicht. Man braucht dazu also zwingend ein DTD, Schema oder ähnliches, wo diese Information ersichtlich ist.