Scala XML.loadString vs expression littérale
J'ai fait des expériences avec Scala et XML, et j'ai trouvé une étrange différence de comportement entre une balise XML créé avec XML.de charge (ou de loadString) et l'écriture comme un littéral. Voici le code :
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" pln">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 des changements. Il n'est jamais le même que celui d'origine. Les attributs de la littérales sont triés par ordre alphabétique (seul danger ?).
Ce ne serait pas un problème si les deux solutions ne se comportent pas différemment lorsque j'essaie de les transformer. J'ai ramassé quelques intresting Code de Daniel C. Sobral à Comment faire pour modifier l'attribut de Scala Élément XML et écrit ma propre règle, afin de supprimer la première barre de l'attribut "href". Le RuleTransformer fonctionne bien avec le in_xml, mais n'a aucun effet sur from_str !
Malheureusement, la plupart de mes programmes ont à y lire XML via XML.charge(...). Donc, je suis coincé. Quelqu'un sait à propos de ce sujet ?
Cordialement,
Henri
Scala littéraux XML ont connu des problèmes avec l'ordre des attributs. Vous avez peut-vote lampsvn.l'epfl.ch/trac/scala/billet/2735. (Je ne sais pas si ils ont fait attention à la voix, mais il ne peut pas nuire.)
Ils ne font pas attention à la voix, bien qu'ils ne prêter attention à l'activité (adhérents, faire des commentaires, etc). Pourtant, il ne fait pas de mal. J'ai, personnellement, de s'abonner à un bug qui m'intéresse, et upvote n'importe qui, je pense, est particulièrement important.
OriginalL'auteur Henri Bauer | 2010-12-09
Vous devez vous connecter pour publier un commentaire.
De ce que je peux voir,
in_xml
etfrom_str
ne sont pas égaux parce que l'ordre des attributs différents. C'est malheureux et en raison de la façon dont le XML est créé par le compilateur. Qui provoque des attributs différents:Vous pouvez voir que si vous remplacez les attributs de la comparaison:
Avec cela dit, je ne vois pas pourquoi ce serait de provoquer un comportement différent dans le code qui remplace le
href
attribut. En fait, je soupçonne que quelque chose est incorrect avec le mode de mappage d'attribut fonctionne. Par exemple, si je remplace lein_str
avec:Il fonctionne très bien. Se pourrait-il que le code de l'attribut de Daniel ne fonctionne que si l'attribut est dans la position de la tête de
MetaData
?Note de côté: à moins que
in_xml
estnull
,equals
et==
retourne la même valeur. Le==
version de vérifier si le premier opérande est null, avant d'appelerequals
.OriginalL'auteur huynhjl
Des tests supplémentaires:
Peut-être, mon premier test d'égalité n'est pas le cas:
et si je test :
Je reçois également obtenir de faux. Peut-être, je dois utiliser une autre méthode de test (comme correspond, mais je n'ai pas trouver ce qu'est un prédicat je devrais utiliser comme deuxième paramètre...)
Cela dit, si je test le suivant dans le REPL
- Je obtenir vrai, même sans l'appel de la méthode equals...
Revenir à mon exemple: j'ai défini une règle de réécriture
Il utilise le helper classes/méthodes définies par Daniel C. Sobral à Comment faire pour modifier l'attribut de Scala Élément XML. Si je demande:
- Je obtenir le résultat attendu, avec in_xml, mais aucune modification avec from_str...
OriginalL'auteur Henri Bauer