Scala XML.loadString vs文字表达式
我一直在尝试使用
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. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |