lxml - xml File unschön

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
xraver
User
Beiträge: 4
Registriert: Dienstag 8. Mai 2007, 11:36
Wohnort: Germany

Hallo,
sorry für den Topic, doch fiel nichts bessere ein.

Ich habe ein xml File was ich so einlese.

Code: Alles auswählen

x = etree.parse('/tmp/xo.xml')
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

print  etree.tostring(x, pretty_print=True)

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...
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>
xraver
User
Beiträge: 4
Registriert: Dienstag 8. Mai 2007, 11:36
Wohnort: Germany

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.
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.
Antworten