xml - Scala XML.loadString 与文字表达式

标签 xml string scala comparison transformation

我一直在尝试使用 Scala 和 XML,我发现使用 XML.load(或 loadString)创建的 XML 标记与将其写为文字之间在行为上存在奇怪的差异。这是代码:

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

类型相同。但是没有平等。属性的顺序发生变化。它与原来的永远不一样。垃圾的属性按字母顺序排序(只有危险?)。

如果在我尝试转换它们时两种解决方案的行为没有不同,这就不是问题。我从 Daniel C. Sobral 在 How to change attribute on Scala XML Element 处获得了一些有趣的代码并编写了我自己的规则以删除“href”属性的第一个斜杠。 RuleTransformer 适用于 in_xml,但对 from_str 没有影响!

不幸的是,我的大部分程序都必须通过 XML.load(...) 读取 XML。所以,我卡住了。有人知道这个话题吗?

最好的问候,

亨利

最佳答案

据我所知,in_xmlfrom_str 不相等,因为属性的顺序不同。这是不幸的,并且由于编译器创建 XML 的方式。这导致属性不同:

scala> in_xml.attributes == from_str.attributes
res30: Boolean = false

您可以看到,如果您替换属性,比较将起作用:

scala> in_xml.copy(attributes=from_str.attributes) == from_str
res32: Boolean = true

话虽如此,我不清楚为什么这会在替换 href 属性的代码中导致不同的行为。事实上,我怀疑属性映射的工作方式有问题。例如,如果我将 in_str 替换为:

val in_str = """<link type="text/css" rel="stylesheet" href="/css/main.css" 
xmlns="http://www.w3.org/1999/xhtml"></link>"""

它工作正常。难道大牛的属性代码只有当属性在MetaData的头部位置时才有效?


旁注:除非 in_xmlnull,否则 equals== 将返回相同的值。 == 版本将在调用 equals 之前检查第一个操作数是否为空。

关于xml - Scala XML.loadString 与文字表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4401702/

相关文章:

css - 加载样式表时出错 : An unknown error has occurred (805303f4)?

c# - 如何使用 C# 和正则表达式解析字符串?

scala - 如何在 Spark 2.1 中保存分区的 Parquet 文件?

ruby-on-rails - to_xml 给出奇怪的结果

java - 如何用Java从xml文件中删除元素

MySQL 字符串中多次出现相同的字母

scala - 有没有办法使用 Scala 的 XML 库执行 XPath 字符串查询?

scala - 使用spark按排序顺序将数据合并到csv文件

ios - 从 AS3 保存到 XML(最终用于 iOS)

javascript - 为什么不在字符串连接操作中调用 Number.toString()?