Я экспериментировал со Scala и XML и обнаружил странную разницу в поведении между тегом XML, созданным с помощью XML.load (или loadString), и записью его как литерала. Вот код:
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()))
И вот, вывод:
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
Типы одинаковые. Но нет равенства. Порядок атрибутов меняется. Он никогда не будет таким же, как оригинальный. Атрибуты литерала отсортированы по алфавиту (только опасность?).
Это не было бы проблемой, если бы оба решения не вели себя по-разному, когда я пытаюсь их преобразовать. Я взял интересный код от Дэниела С. Собрала в Как изменить атрибут на Scala XML Element и написал собственное правило, чтобы удалить первую косую черту атрибута "href". RuleTransformer хорошо работает с in_xml, но не влияет на from_str!
К сожалению, большинству моих программ приходится читать там XML через XML.load(...). Итак, я застрял. Кто-то знает об этой теме?
С наилучшими пожеланиями,
Анри