Scala XML序列化
看到Scala的强大功能,我想知道是否可以使用内置的Scala语言功能和库(例如,没有XMLEncoder、XStream或JAXB)将任意对象图序列化并从XML反序列化到XML。不幸的是,我还没有找到这样的解决办法。你有什么建议吗?恐怕没有这回事。但您可能想看看Scala本机类库中的任何内容。但是并不缺少能够做到这一点的Java库。在“建议”方面,我们已经使用本机库来处理许多快速而肮脏的配置文件。主要优点是“解析”代码用于添加漂亮的错误消息。像这样:Scala XML序列化,xml,serialization,scala,Xml,Serialization,Scala,看到Scala的强大功能,我想知道是否可以使用内置的Scala语言功能和库(例如,没有XMLEncoder、XStream或JAXB)将任意对象图序列化并从XML反序列化到XML。不幸的是,我还没有找到这样的解决办法。你有什么建议吗?恐怕没有这回事。但您可能想看看Scala本机类库中的任何内容。但是并不缺少能够做到这一点的Java库。在“建议”方面,我们已经使用本机库来处理许多快速而肮脏的配置文件。主要优点是“解析”代码用于添加漂亮的错误消息。像这样: val xml = xml.XML.loa
val xml = xml.XML.load( source )
val required = ( xml \ "value" ).firstOption match {
case None => error( "The value element is missing, or should I be a default?" )
case Some( req ) => req
}
这是我通常使用XStream之类的东西的地方,所以它不是一个很大的开关。我不确定你是否能在反序列化框架上通过库获得错误消息+默认处理。我不知道“是否可以使用内置的Scala语言功能和库将任意对象图序列化并反序列化到XML或从XML反序列化到XML”,但由于Scala中有一些对XML的本机支持,我将提及它们。更多详细信息请参见《使用XML:
本章介绍Scala的
对XML的支持。讨论后
一般来说,它是半结构化数据
显示了中的基本功能
用于处理XML的Scala:如何
使用XML文本创建节点,如何
保存XML并将其加载到文件,以及如何
使用查询分离XML节点
方法和模式匹配
为了快速总结本章,我将引用一些要点
- Scala包括对处理XML的特殊支持
- Scala允许您在表达式有效的任何位置键入XML作为文本
- 可以使用卷轴括号({})作为一个转义来评估XML文本中间的Scala代码。
val foo = <a> {3 + 4} </a>
另外,在一本名为的手册草稿中可以找到更多信息。在net.liftweb.json包object xml中,我找到了以下函数:
def toXml(json: JValue): NodeSeq = {
def toXml(name: String, json: JValue): NodeSeq = json match {
case JObject(fields) => new XmlNode(name, fields flatMap { f => toXml(f.name, f.value) })
case JArray(xs) => xs flatMap { v => toXml(name, v) }
case JField(n, v) => new XmlNode(name, toXml(n, v))
case JInt(x) => new XmlElem(name, x.toString)
case JDouble(x) => new XmlElem(name, x.toString)
case JString(x) => new XmlElem(name, x)
case JBool(x) => new XmlElem(name, x.toString)
case JNull => new XmlElem(name, "null")
case JNothing => Text("")
}
json match {
case JField(n, v) => toXml(n, v)
case JObject(fields) => fields flatMap { f => toXml(f.name, f.value) }
case x => toXml("root", x)
}
}
有一个提取包,它的函数至少可以将case类转换为JSON。与toXml一起,这可能会将许多数据类型转换为XML。感谢您的详细回答。不过我想要一个通用的解决方案,其中序列化代码只编写一次,而不是在每个类中编写,以避免样板代码和信息重复。
def toXml(json: JValue): NodeSeq = {
def toXml(name: String, json: JValue): NodeSeq = json match {
case JObject(fields) => new XmlNode(name, fields flatMap { f => toXml(f.name, f.value) })
case JArray(xs) => xs flatMap { v => toXml(name, v) }
case JField(n, v) => new XmlNode(name, toXml(n, v))
case JInt(x) => new XmlElem(name, x.toString)
case JDouble(x) => new XmlElem(name, x.toString)
case JString(x) => new XmlElem(name, x)
case JBool(x) => new XmlElem(name, x.toString)
case JNull => new XmlElem(name, "null")
case JNothing => Text("")
}
json match {
case JField(n, v) => toXml(n, v)
case JObject(fields) => fields flatMap { f => toXml(f.name, f.value) }
case x => toXml("root", x)
}
}