Scala XML.loadString vs literaler Ausdruck

8

Ich habe mit Scala und XML experimentiert und einen merkwürdigen Unterschied im Verhalten zwischen einem XML-Tag, das mit XML.load (oder loadString) erstellt wurde, und dem Schreiben als Literal gefunden. Hier ist der Code:

%Vor%

Und hier die Ausgabe:

%Vor%

Die Typen sind gleich. Aber es gibt keine Gleichheit. Die Reihenfolge der Attribute ändert sich. Es ist nie dasselbe wie das Original. Die Attribute des Literal sind alphabetisch sortiert (nur Gefahr?).

Dies wäre kein Problem, wenn sich beide Lösungen nicht anders verhalten würden, wenn ich versuche, sie zu transformieren. Ich habe einen interessanten Code von Daniel C. Sobral bei Wie ändere ich das Attribut auf Scala XML-Element und schrieb meine eigene Regel, um den ersten Schrägstrich des Attributs "href" zu entfernen. Der RuleTransformer funktioniert gut mit dem in_xml, hat aber keinen Einfluss auf from_str!

Leider müssen die meisten meiner Programme dort XML über XML.load (...) lesen. Also, ich stecke fest. Kennt jemand dieses Thema?

Mit freundlichen Grüßen

Henri

    
Henri Bauer 09.12.2010, 18:23
quelle

2 Antworten

1

Was ich sehen kann, sind in_xml und from_str nicht gleich, da die Reihenfolge der Attribute unterschiedlich ist. Dies ist unglücklich und aufgrund der Art, wie das XML vom Compiler erstellt wird. Das bewirkt, dass die Attribute unterschiedlich sind:

%Vor%

Sie sehen, dass der Vergleich funktioniert, wenn Sie die Attribute ersetzen:

%Vor%

Damit ist mir nicht klar, warum das ein anderes Verhalten im Code verursachen würde, das das href -Attribut ersetzt. In der Tat vermute ich, dass etwas mit der Art und Weise, wie Attributzuordnungen funktionieren, nicht stimmt. Zum Beispiel, wenn ich in_str durch ersetzen:

%Vor%

Es funktioniert gut. Könnte es sein, dass der Attributcode von Daniel nur funktioniert, wenn sich das Attribut in der Kopfposition von MetaData befindet?

Randnotiz: Wenn nicht in_xml ist null , equals und == würden den gleichen Wert zurückgeben. Die == version überprüft, ob der erste Operand null ist, bevor equals aufgerufen wird.

    
huynhjl 11.12.2010 06:13
quelle
0

Einige weitere Tests: Vielleicht ist mein erster Gleichheitstest nicht angebracht:

%Vor%

und wenn ich teste:

%Vor%

Ich bekomme auch falsch. Vielleicht sollte ich eine andere Testmethode verwenden (wie korrespondiert, aber ich habe nicht herausgefunden, welches Prädikat ich als zweiten Parameter verwenden soll ...)

Das heißt, wenn ich das Folgende in der REPL

teste %Vor%

Ich werde wahr, auch ohne die equals-Methode aufzurufen ...

Zurück zu meinem ersten Beispiel: Ich habe eine Rewrite-Regel definiert

%Vor%

Es verwendet die Hilfsklassen / Methoden, die von Daniel C. Sobral bei Wie man das Attribut auf dem Scala XML-Element ändert . Wenn ich mich bewerbe:

%Vor%

Ich bekomme das erwartete Ergebnis mit in_xml, aber keine Änderung mit from_str ...

    
Henri Bauer 10.12.2010 10:01
quelle