Ich habe mit Scala und XML experimentiert und ich fand einen seltsamen Unterschied im Verhalten zwischen einem XML-Tag erstellt mit XML.load (oder loadString) und schreiben es als Literal. Hier ist der Code:Scala XML.loadString vs Literal Ausdruck
import scala.xml._
// creating a classical link HTML tag
val in_xml = <link type="text/css" href="/css/main.css" rel="stylesheet" xmlns="http://www.w3.org/1999/xhtml"></link>
// The same as a String
val in_str = """<link type="text/css" href="/css/main.css" rel="stylesheet" xmlns="http://www.w3.org/1999/xhtml"></link>"""
// Convert the String into XML
val from_str = XML.loadString(in_str)
println("in_xml : " + in_xml)
println("from_str: "+ from_str)
println("val_xml == from_str: "+ (in_xml == from_str))
println("in_xml.getClass() == from_str.getClass(): " +
(in_xml.getClass() == from_str.getClass()))
Und hier die Ausgabe:
in_xml : <link href="/css/main.css" rel="stylesheet" type="text/css" xmlns="http://www.w3.org/1999/xhtml"></link>
from_str: <link rel="stylesheet" href="/css/main.css" type="text/css" xmlns="http://www.w3.org/1999/xhtml"></link>
val_xml == from_str: false
in_xml.getClass() == from_str.getClass(): true
Die Typen sind die gleichen. Aber es gibt keine Gleichheit. Die Reihenfolge der Attribute ändert sich. Es ist nie dasselbe wie das Original. Die Attribute des Literals 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 unter How to change attribute on Scala XML Element gelesen und meine eigene Regel geschrieben, 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. Weiß jemand von diesem Thema?
Mit freundlichen Grüßen,
Henri
Dies ist definitiv ein Fehler. Nicht, dass das hilft ... –
Scala XML-Literale haben bekannte Probleme mit der Reihenfolge der Attribute. Sie könnten http://lampsvn.epfl.ch/trac/scala/ticket/2735 abstimmen. (Ich weiß nicht, ob sie tatsächlich auf Stimmen achten, aber es kann nicht schaden.) – Steve
Sie achten nicht auf Stimmen, obwohl sie auf Aktivität achten (Leute abonnieren, Kommentare machen, etc.). Trotzdem tut es nicht weh. Ich persönlich abonniere jeden Fehler, für den ich mich interessiere, und verbessere jeden, der meiner Meinung nach besonders wichtig ist. –