加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

Scala XML.loadString vs文字表达式

发布时间:2020-12-16 08:50:57 所属栏目:安全 来源:网络整理
导读:我一直在尝试使用 Scala和XML,我发现使用XML.load(或loadString)创建的XML标记与将其写为文字之间的行为存在奇怪的差异.这是代码: import scala.xml._// creating a classical link HTML tagval in_xml = link type="text/css" href="/css/main.css" rel="s
我一直在尝试使用 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

类型是相同的.但是没有平等.属性的顺序会发生变化.它永远不会与原来的相同. litteral的属性按字母顺序排序(仅危险?).

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

不幸的是,我的大多数程序都必须通过XML.load(…)读取XML.所以,我被困住了.有人知道这个话题吗?

最好的祝福,

亨利

解决方法

从我所看到的,in_xml和from_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>"""

它工作正常.可能是Daniel的属性代码只有在属性位于MetaData的头部位置时才有效吗?

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读