ElementTree sortiert automatisch alphabetisch oO?

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
Benutzeravatar
BlackVivi
User
Beiträge: 762
Registriert: Samstag 9. Dezember 2006, 14:29
Kontaktdaten:

Nja, ist eigentlich'ne tolle Sache, wenn man eine XML mit ElementTree parst, kommen die Attribute nach alphabetischer Reihenfolge hinten wieder raus. Normalerweise ist das auch von mir gewollt, dieses mal jedoch nicht. Gibt's vielleicht'ne Möglichkeit, dass abzuschalten?
BlackJack

Die kommen nicht alphabetisch heraus sondern in *irgend einer* Reihenfolge. Die scheint bei Dir zufällig alphabetisch zu sein. Die Reihenfolge von Attributen ist bei XML egal. Du kannst also von keinem Programm, das XML verarbeitet erwarten, dass sich die Reihenfolge von Attributen in der XML-Datei nicht ändert.
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Mir scheint, dass XML nicht vorsieht dass die Reihenfolge der Attribute eine Rolle spielt - habe auch keine Anwendung gesehen die auf das achten würde. Somit scheint mir das Verhalten von ElementTree durchaus normal, wenn auch auf den ersten Blick verwunderlich zu sein.

Wieso brauchst du denn die Reihenfolge von Attributen?

Seltsamerweise unterstützt Luas Element Tree die Sortierung von Attributen via ``attr_sort``.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Benutzeravatar
BlackVivi
User
Beiträge: 762
Registriert: Samstag 9. Dezember 2006, 14:29
Kontaktdaten:

BlackJack hat geschrieben:Die kommen nicht alphabetisch heraus sondern in *irgend einer* Reihenfolge. Die scheint bei Dir zufällig alphabetisch zu sein. Die Reihenfolge von Attributen ist bei XML egal. Du kannst also von keinem Programm, das XML verarbeitet erwarten, dass sich die Reihenfolge von Attributen in der XML-Datei nicht ändert.
Du wirst aber lachen, probiers selber oO'... Wenn ich eine XML Datei mir selbst zusammenschreibe, es einmal kurz parse, wieder zurückschreib... Wird die Reihenfolge der Attribute geändert. Wirklich! Und normalerweise müsste ein Programm mit der geänderten Reihenfolge ja keine Probleme haben... Jedoch ist's nicht mein Programm, kann es leider nicht verwenden und kommt nur mit einer bestimmten Reihenfolge klar.
BlackJack

Ich weiss das ElementTree die Reihenfolge ändern kann. Das habe ich doch auch geschrieben: Es kommt *irgend eine* Reihenfolge am Ende raus. Die muss weder mit der ursprünglichen übereinstimmen, noch ist sie zwangsläufig alphabetisch sortiert.

Der XML-Standard sagt, dass Attribute keine bestimmte Reihenfolge haben und ElementTree speichert die Attribute naheliegenderweise in einem Dictionary.
Benutzeravatar
BlackVivi
User
Beiträge: 762
Registriert: Samstag 9. Dezember 2006, 14:29
Kontaktdaten:

BlackJack hat geschrieben:Ich weiss das ElementTree die Reihenfolge ändern kann. Das habe ich doch auch geschrieben: Es kommt *irgend eine* Reihenfolge am Ende raus. Die muss weder mit der ursprünglichen übereinstimmen, noch ist sie zwangsläufig alphabetisch sortiert.

Der XML-Standard sagt, dass Attribute keine bestimmte Reihenfolge haben und ElementTree speichert die Attribute naheliegenderweise in einem Dictionary.
Die kommen aber alphabetisch heraus ;__;

Moment...

Code: Alles auswählen

<root>
  <element c="1" b="2" a="1">
    <subelement />
  </element>
</root>
Den Code damit ausführen:

Code: Alles auswählen

from elementtree import ElementTree as ET

root = ET.parse("foo.xml").getroot()
ET.ElementTree(root).write("bar.xml")

Das kommt heraus:

Code: Alles auswählen

<root>
  <element a="1" b="2" c="1">
    <subelement />
  </element>
</root>
DAS IS WOHL ALPHABETISCH ;___; oder bin ich blöd ;_;


Edit: Und das das Programm, dass die XMLs braucht, sie falsch parst, weiß ich doch selber. Aber dafür kann ich doch nichts ;_;
Benutzeravatar
keppla
User
Beiträge: 483
Registriert: Montag 31. Oktober 2005, 00:12

BlackVivi hat geschrieben:
BlackJack hat geschrieben:Ich weiss das ElementTree die Reihenfolge ändern kann. Das habe ich doch auch geschrieben: Es kommt *irgend eine* Reihenfolge am Ende raus. Die muss weder mit der ursprünglichen übereinstimmen, noch ist sie zwangsläufig alphabetisch sortiert.

Der XML-Standard sagt, dass Attribute keine bestimmte Reihenfolge haben und ElementTree speichert die Attribute naheliegenderweise in einem Dictionary.
Die kommen aber alphabetisch heraus ;__;
Ja, und inwiefern widerspricht das dem, was Blackjack sagte?
Alphabetisch ist eine beliebige Reihenfolge (eine von vielen möglichen), und du kannst dich nicht drauf verlassen, dass das so bleibt.
Benutzeravatar
BlackVivi
User
Beiträge: 762
Registriert: Samstag 9. Dezember 2006, 14:29
Kontaktdaten:

keppla hat geschrieben:
BlackVivi hat geschrieben:
BlackJack hat geschrieben:Ich weiss das ElementTree die Reihenfolge ändern kann. Das habe ich doch auch geschrieben: Es kommt *irgend eine* Reihenfolge am Ende raus. Die muss weder mit der ursprünglichen übereinstimmen, noch ist sie zwangsläufig alphabetisch sortiert.

Der XML-Standard sagt, dass Attribute keine bestimmte Reihenfolge haben und ElementTree speichert die Attribute naheliegenderweise in einem Dictionary.
Die kommen aber alphabetisch heraus ;__;
Ja, und inwiefern widerspricht das dem, was Blackjack sagte?
Alphabetisch ist eine beliebige Reihenfolge (eine von vielen möglichen), und du kannst dich nicht drauf verlassen, dass das so bleibt.
Doch! Ich kann mich darauf verlassen, dass wenn ich es mit ElementTree parse, es immer alphabetisch herauskommt. Und das will ich nicht. Ich will die ursprüngliche Reihenfolge behalten. Ich dachte es gäbe ein Attribut wie: "ElementTree.sort = False" und dann wär alles gut. Gibts scheinbar nicht und es ist kein Interesse daran... Andere Parser haben das bspw auch!... Und deswegen habe ich das gesucht. Ich weiß, normalrewise braucht sowas keine Sau. Aber ich brauchs wegen anderer Software.
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Kannst es ja beim dumpen sortieren wie es dir passt, oder?
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Benutzeravatar
BlackVivi
User
Beiträge: 762
Registriert: Samstag 9. Dezember 2006, 14:29
Kontaktdaten:

Leonidas hat geschrieben:Kannst es ja beim dumpen sortieren wie es dir passt, oder?
*kopfkratz* Öhm, hab eigentlich schon'ne Lösung. Ich les dann danach die Datei ein und disponier es entsprechend um. Ein sehr hässlicher hack, aber es funktioniert. Häts nur irgendwie schön gefunden, wenn es eine Methode gegeben hätte. Ich schau mir mal den Quelltext von ElementTree an und schreib notfalls'n Patch. Wär'ne lustige Aufgabe. Ich dachte halt wirklich nur, dass's total einfach wär, es abzuschalten.
BlackJack

@BlackVivi: Die Attribute kommen in einer *beliebigen* Reihenfolge heraus. *Eine* beliebige Reihenfolge ist alphabetisch sortiert. Darauf kannst Du Dich aber nicht verlassen. Das ist bei Deinen Daten *zufällig* so und ist in keinster Weise garantiert.
Benutzeravatar
BlackVivi
User
Beiträge: 762
Registriert: Samstag 9. Dezember 2006, 14:29
Kontaktdaten:

BlackJack hat geschrieben:@BlackVivi: Die Attribute kommen in einer *beliebigen* Reihenfolge heraus. *Eine* beliebige Reihenfolge ist alphabetisch sortiert. Darauf kannst Du Dich aber nicht verlassen. Das ist bei Deinen Daten *zufällig* so und ist in keinster Weise garantiert.
Ich versteh nicht, wieso das nicht garantiert ist?... Jedesmal, wenn ich etwas mit'n offiziellen EFFBOT ElementTree parse, wird's alphabetisch auf'r anderen Seite herauskommen ._.
Benutzeravatar
keppla
User
Beiträge: 483
Registriert: Montag 31. Oktober 2005, 00:12

BlackVivi hat geschrieben:Ich versteh nicht, wieso das nicht garantiert ist?...
Weil es eben niemand garantiert. Es könnte mengen geben, die nicht alphabetisch sortiert wären. z.B. könnte es sein, dass elemente, die mit "effbot" anfangen, immer zuerst kommen, du hast es nur noch nie gesehen.
Ebenso könnte es mit dem nächsten patch eine andere Reihenfolge gewählt werden.
Benutzeravatar
BlackVivi
User
Beiträge: 762
Registriert: Samstag 9. Dezember 2006, 14:29
Kontaktdaten:

keppla hat geschrieben:
BlackVivi hat geschrieben:Ich versteh nicht, wieso das nicht garantiert ist?...
Weil es eben niemand garantiert. Es könnte mengen geben, die nicht alphabetisch sortiert wären. z.B. könnte es sein, dass elemente, die mit "effbot" anfangen, immer zuerst kommen, du hast es nur noch nie gesehen.
Ebenso könnte es mit dem nächsten patch eine andere Reihenfolge gewählt werden.
Gut. Dann formulier ich's um:

Will'n Schalter, Attribut, Lösungsgedanke usw usw damit die ursprüngliche Reihenfolge unberührt bleibt. Gibt's sowas?
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

BlackVivi hat geschrieben:Will'n Schalter, Attribut, Lösungsgedanke usw usw damit die ursprüngliche Reihenfolge unberührt bleibt. Gibt's sowas?
Wenn es wie BlackJack meint, intern ein ``dict`` nutzt dann nicht. Das müsste man an der stelle durch ein insert-order ordered dict ersetzen. Dafür gibt es eine gute Implementation von Fuzzyman und eine C-Implementation, die ein Fork vom normalen ``dict`` ist. Nutze ich selbst und bin damit zufrieden. Allerdings wird Effbot über solche Abhängigkeiten nicht glücklich sein.
Kannst aber sowas vermutlich über Monkeypatching hinbekommen, musst mal in den Code gucken.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Benutzeravatar
BlackVivi
User
Beiträge: 762
Registriert: Samstag 9. Dezember 2006, 14:29
Kontaktdaten:

Da! Gefunden. In der Datei "ElementTree.py":

Code: Alles auswählen

            file.write("<" + _encode(tag, encoding))
            if items or xmlns_items:
                items.sort() # lexical order
Zeile 719. Es sortiert also alphabetisch. Aber beim parsen packt es die Dateien nicht unberührt in einen Dict, sondern verändert dort die Reihenfolge auch (NICHT ALPHABETISCH!!!111einself)... Merkt man, wenn man durch die Attribs iteriert.

(Und es ist doch nicht beliebig ;_;)
Benutzeravatar
keppla
User
Beiträge: 483
Registriert: Montag 31. Oktober 2005, 00:12

BlackVivi hat geschrieben:(Und es ist doch nicht beliebig ;_;)
Du verstehst es leider immer noch falsch: Es ist beliebigerweise alphabetisch. Die _aktuelle_ implementation ist alphabetisch. Wer sagt dir, dass das so bleibt?
Der Unterschied ist etwa der zwischen "meine Katze ist schwarz" und "alle Katzen sind schwarz".
Benutzeravatar
BlackVivi
User
Beiträge: 762
Registriert: Samstag 9. Dezember 2006, 14:29
Kontaktdaten:

In Ordnung, ihr habt Recht. Ich werde demnächst'n Patch schreiben, der das parsen um die Option: "sort=True" erweitert.
Antworten