首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将具有名称空间和属性的复杂Scala XML转换为Scala对象

将具有名称空间和属性的复杂Scala XML转换为Scala对象
EN

Stack Overflow用户
提问于 2013-05-16 04:21:29
回答 1查看 611关注 0票数 0

将普通的Scala XML转换为对象似乎真的很容易:

<object><field>1</field></object>可以使用case类Object( field: Int )和Scala的原生XML创建类似Object(1)的东西。

但是,如果XML包含名称空间和属性呢?例如ATOM格式?

代码语言:javascript
复制
<entry xmlns="http://www.w3.org/2005/Atom" xmlns:activity="http://activitystrea.ms/spec/1.0/" xmlns:service="http://activitystrea.ms/service-provider" xmlns:thr="http://purl.org/syndication/thread/1.0" xmlns:georss="http://www.georss.org/georss" xmlns:gnip="http://www.gnip.com/schemas/2010">
<id>456520791711374025_380135597</id>
<published>2013-05-15T18:12:20Z</published>
<source>
<link rel="self" type="application/json" href="https://url.com/v1/tags/taghere/media/recent?client_id=xxxxxxxxxxx"/>
<updated>2013-05-15T18-12-43Z</updated>
<gnip:rule xmlns:gnip="http://www.gnip.com/schemas/2010">rulehere</gnip:rule>
</source>
<service:provider>
<name>Provider</name>
<uri>www.url.com</uri>
</service:provider>
<activity:verb>http://activitystrea.ms/schema/1.0/post</activity:verb>
<activity:object>
<activity:object-type>http://activitystrea.ms/schema/1.0/image</activity:object-type>
<gnip:statistics favoriteCount="0"/>
</activity:object>
</entry>
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-05-16 04:21:29

处理更复杂的XML格式需要特定类的高级注释。推荐的策略是使用像JAXB这样的东西来注释类中的每个字段。

下面是一些改编自http://krasserm.blogspot.ca/2012/02/using-jaxb-for-xml-and-json-apis-in.html的示例代码

代码语言:javascript
复制
import scala.annotation.meta.field 

//Scala 2.9 or lower uses scala.annotation.target.field
 
import javax.xml.bind.annotation._
import javax.xml.bind.annotation.adapters._
 
type xmlElement     = XmlElement @field
type xmlTypeAdapter = XmlJavaTypeAdapter @field
 
class StringOptionAdapter extends OptionAdapter[String](null, "")
class OptionAdapter[A](nones: A*) extends XmlAdapter[A, Option[A]] {
  def marshal(v: Option[A]): A = v.getOrElse(nones(0))
  def unmarshal(v: A) = if (nones contains v) None else Some(v)
}
 
@XmlRootElement(name = "person")
@XmlAccessorType(XmlAccessType.FIELD)
case class Person(
    @xmlElement(required=true) fullname: String, 
    @xmlTypeAdapter(classOf[StringOptionAdapter]) username: Option[String], 
    age: Int) {
  // only needed and accessed by JAXB
  private def this() = this("", None, 0)
}

请注意,case类要求您以特定字段为目标,因此需要导入annotation.meta.field

仅供参考,您可以在此处添加JAXB作为依赖项:http://search.maven.org/#artifactdetails%7Cjavax.xml.bind%7Cjaxb-api%7C2.2.9%7Cjar

编辑

尽管我个人并不喜欢,但也可以通过scalaxb获得对Xml的支持。它是作为一个本地插件工作的,并不一定是一个典型的Maven依赖。它使用诸如XML模板之类的高级功能。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16574273

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档