xml - Scala 中空字符串 XML 属性的正确行为是什么

标签 xml scala

我一直在处理一些 XML,我注意到当 scala.xml.Node 遇到值为空字符串的属性时,我看到了两种不同的行为。例如,使用 Scala 2.10.3:

scala> val test1 = <Object Name="Test" Attr=""/>
test1: scala.xml.Elem = <Object Name="Test" Attr=""/>

scala> scala.xml.XML.save("test1.xml", test1)

scala> val test2 = scala.xml.XML.loadFile("test1.xml")
test2: scala.xml.Elem = <Object Attr="" Name="Test"/>

scala> test1 == test2
res1: Boolean = true

我有两个节点(从技术上讲,它们是元素),除了属性顺序外,它们看起来完全相同。但是当我尝试提取“Attr”属性的值时,我得到了不同的结果

scala> val attr1 = (test1 \ "@Attr").headOption
attr1: Option[scala.xml.Node] = None

scala> val attr2 = (test2 \ "@Attr").headOption
attr2: Option[scala.xml.Node] = Some()

或者:

scala> val attrs1 = test1.attributes
attrs1: scala.xml.MetaData =  Name="Test" Attr=""

scala> val attrs2 = test2.attributes
attrs2: scala.xml.MetaData =  Attr="" Name="Test"

scala> attrs1 == attrs2
res5: Boolean = true

scala> val attr1 = attrs1.get("Attr")
attr1: Option[Seq[scala.xml.Node]] = Some(List())

scala> val attr2 = attrs2.get("Attr")
attr2: Option[Seq[scala.xml.Node]] = Some()

知道这些差异从何而来吗?什么是正确的行为?如果我想可靠地区分一个完全缺失的属性和一个存在但为空的属性,我是否基本上已经放弃使用其他东西来进行解析?

最佳答案

神奇的事情发生在你打电话的时候

scala.xml.XML.loadFile("test1.xml")

SaxParser 空属性解析(test2)导致 scala.xml.UnprefixedAttribute 具有值 scala.collection.immutable.List 具有单个元素 scala.xml.Text 具有属性数据:String = ""

内联创建的 Xml (test1) 具有空属性,如 scala.xml.UnprefixedAttribute,值为 scala.collection.immutable.Nil

这些属性是相等的,因为比较有趣。它通过 org.scala.Metadata#asAttrMap 比较属性:

  def asAttrMap: Map[String, String] =
    iterator map (x => (x.prefixedKey, x.value.text)) toMap

如你所见,Nil 和 List(Text("")) 具有相同的 x.value.text 值,等于 ""

如果你有更多问题,我很乐意回答

关于xml - Scala 中空字符串 XML 属性的正确行为是什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20503730/

相关文章:

android - 为不同屏幕密度转换布局 dpi 的工具

java - 如何将nodelist中的xml解析为java

iphone - 有没有一种简单的方法可以为 iPhone 开发人员使用 Web 服务?

scala - Cats Effect IO - 在使用尝试/兑换 "inside"顶级平面图时,如何确保将引发的异常捕获为值?

Scala TreeSet 过滤器复杂度

json - 如何在 C# 中将 *.RESX XML 文件转换为 JSON 文件

java - XPath 输出不连贯

scala - 如何以批处理模式运行以配置为前缀的 SBT 任务?

scala - 属性错误 : 'list' object has no attribute 'map'

scala - 从 scala.collection.immutable.Iterable[String] 中删除第一个和最后一个元素