He estado experimentando con Scala y XML y encontré una extraña diferencia en el comportamiento entre una etiqueta XML creada con XML.load (o loadString) y escribiéndola como un literal. Aquí está el código:Scala XML.loadString vs expresión literal
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()))
Y aquí, la salida:
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
Los tipos son los mismos. Pero no hay igualdad. El orden de los atributos cambia. Nunca es el mismo que el original. Los atributos del litteral están ordenados alfabéticamente (¿solo riesgo?).
Esto no sería un problema si ambas soluciones no se comportaron de manera diferente cuando intento transformarlas. Recogí un código interesante de Daniel C. Sobral al How to change attribute on Scala XML Element y escribí mi propia regla para eliminar la primera barra del atributo "href". ¡RuleTransformer funciona bien con in_xml, pero no tiene efecto en from_str!
Desafortunadamente, la mayoría de mis programas tienen que leer XML a través de XML.load (...). Entonces, estoy atascado. ¿Alguien sabe sobre este tema?
Saludos,
Henri
Esto es definitivamente un error. No es que eso ayude ... –
Los literales de Scala XML tienen problemas conocidos con el orden de los atributos. Puede votar por http://lampsvn.epfl.ch/trac/scala/ticket/2735. (No sé si realmente prestan atención a los votos, pero no puede hacer daño.) – Steve
No prestan atención a los votos, aunque prestan atención a la actividad (personas que se suscriben, hacen comentarios, etc.). Aún así, no duele. Personalmente, me suscribo a cualquier error que me interese y recomiendo cualquiera que considero particularmente importante. –