ElementTree sortiert automatisch alphabetisch oO?
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?
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.
-
- 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``.
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
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 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.
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.
Der XML-Standard sagt, dass Attribute keine bestimmte Reihenfolge haben und ElementTree speichert die Attribute naheliegenderweise in einem Dictionary.
Die kommen aber alphabetisch heraus ;__;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.
Moment...
Code: Alles auswählen
<root>
<element c="1" b="2" a="1">
<subelement />
</element>
</root>
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>
Edit: Und das das Programm, dass die XMLs braucht, sie falsch parst, weiß ich doch selber. Aber dafür kann ich doch nichts ;_;
Ja, und inwiefern widerspricht das dem, was Blackjack sagte?BlackVivi hat geschrieben:Die kommen aber alphabetisch heraus ;__;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.
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.keppla hat geschrieben:Ja, und inwiefern widerspricht das dem, was Blackjack sagte?BlackVivi hat geschrieben:Die kommen aber alphabetisch heraus ;__;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.
Alphabetisch ist eine beliebige Reihenfolge (eine von vielen möglichen), und du kannst dich nicht drauf verlassen, dass das so bleibt.
*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.Leonidas hat geschrieben:Kannst es ja beim dumpen sortieren wie es dir passt, oder?
@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 ._.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.
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.BlackVivi hat geschrieben:Ich versteh nicht, wieso das nicht garantiert ist?...
Ebenso könnte es mit dem nächsten patch eine andere Reihenfolge gewählt werden.
Gut. Dann formulier ich's um:keppla hat geschrieben: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.BlackVivi hat geschrieben:Ich versteh nicht, wieso das nicht garantiert ist?...
Ebenso könnte es mit dem nächsten patch eine andere Reihenfolge gewählt werden.
Will'n Schalter, Attribut, Lösungsgedanke usw usw damit die ursprüngliche Reihenfolge unberührt bleibt. Gibt's sowas?
-
- Python-Forum Veteran
- Beiträge: 16025
- Registriert: Freitag 20. Juni 2003, 16:30
- Kontaktdaten:
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.BlackVivi hat geschrieben:Will'n Schalter, Attribut, Lösungsgedanke usw usw damit die ursprüngliche Reihenfolge unberührt bleibt. Gibt's sowas?
Kannst aber sowas vermutlich über Monkeypatching hinbekommen, musst mal in den Code gucken.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Da! Gefunden. In der Datei "ElementTree.py":
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 ;_;)
Code: Alles auswählen
file.write("<" + _encode(tag, encoding))
if items or xmlns_items:
items.sort() # lexical order
(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?BlackVivi hat geschrieben:(Und es ist doch nicht beliebig ;_;)
Der Unterschied ist etwa der zwischen "meine Katze ist schwarz" und "alle Katzen sind schwarz".
In Ordnung, ihr habt Recht. Ich werde demnächst'n Patch schreiben, der das parsen um die Option: "sort=True" erweitert.