J'ai expérimenté avec Scala et XML et j'ai trouvé une étrange différence de comportement entre une balise XML créée avec XML.load (ou loadString) et l'écriture littérale. Voici le code:Scala XML.loadString vs expression littérale
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()))
Et ici, la sortie:
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
Les types sont les mêmes. Mais il n'y a pas d'égalité. L'ordre des attributs change. Ce n'est jamais le même que l'original. Les attributs de la littérature sont triés par ordre alphabétique (seul danger?).
Cela ne poserait aucun problème si les deux solutions ne se comportaient pas différemment lorsque j'essayais de les transformer. J'ai récupéré un code intressant de Daniel C. Sobral au How to change attribute on Scala XML Element et j'ai écrit ma propre règle afin de supprimer la première barre oblique de l'attribut "href". Le RuleTransformer fonctionne bien avec l'in_xml, mais n'a aucun effet sur from_str!
Malheureusement, la plupart de mes programmes doivent lire du XML via XML.load (...). Donc, je suis coincé. Est-ce que quelqu'un est au courant de ce sujet?
Meilleures salutations,
Henri
Ceci est certainement un bug. Pas que cela aide ... –
Les littéraux Scala XML ont connu des problèmes avec l'ordre des attributs. Vous pouvez voter pour http://lampsvn.epfl.ch/trac/scala/ticket/2735. (Je ne sais pas s'ils font vraiment attention aux votes, mais cela ne peut pas faire de mal.) – Steve
Ils ne font pas attention aux votes, bien qu'ils fassent attention à l'activité (les gens qui s'abonnent, font des commentaires, etc.). Pourtant, ça ne fait pas mal. Personnellement, je m'abonne à tout bogue qui m'intéresse et je mets en avant tout ce qui me semble particulièrement important. –