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

Mittwoch 19. Dezember 2007, 12:05

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

Mittwoch 19. Dezember 2007, 12:27

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
Administrator
Beiträge: 16024
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Mittwoch 19. Dezember 2007, 12:30

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

Mittwoch 19. Dezember 2007, 12:31

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

Mittwoch 19. Dezember 2007, 13:50

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:

Mittwoch 19. Dezember 2007, 14:03

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

Mittwoch 19. Dezember 2007, 14:07

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:

Mittwoch 19. Dezember 2007, 14:09

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
Administrator
Beiträge: 16024
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Mittwoch 19. Dezember 2007, 14:16

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

Mittwoch 19. Dezember 2007, 14:18

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

Mittwoch 19. Dezember 2007, 14:27

@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:

Mittwoch 19. Dezember 2007, 14:29

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

Mittwoch 19. Dezember 2007, 14:35

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:

Mittwoch 19. Dezember 2007, 14:36

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
Administrator
Beiträge: 16024
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Mittwoch 19. Dezember 2007, 14:43

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