XML and Case Class

本文介绍如何使用XStream库进行Scala Case Class与XML之间的序列化和反序列化操作。通过具体示例展示了如何配置XStream来处理自定义类,并提供测试用例验证转换的正确性。
XML and Case Class

I compare the library scalaxb and XStream. It seems to me that XStream is more easy to use.

Here is first step to add the dependencies.
"com.thoughtworks.xstream" % "xstream" % "1.4.8",
"org.joda" % "joda-convert" % "1.7",

The Trait object to deal with the xstream base class.
package com.sillycat.jobsconsumer.utilities

import com.sillycat.jobsconsumer.models.Job
import com.thoughtworks.xstream.XStream
import com.thoughtworks.xstream.io.xml.DomDriver

trait IncludeXMLMapping {

var xStream : XStream = new XStream(new DomDriver())

xStream.alias("job", classOf[Job])

def toXML(obj:Any): String ={
xStream.toXML(obj)
}

def fromXML(xml:String):Any = {
xStream.fromXML(xml)
}

}

Here is the Test Class
package com.sillycat.jobsconsumer.models

import com.sillycat.jobsconsumer.utilities.{IncludeXMLMapping}
import org.scalatest.{BeforeAndAfter, Matchers, FunSpec}

class JobXMLSpec extends FunSpec with Matchers with BeforeAndAfter with IncludeXMLMapping {

describe("JobXMLMapping") {
describe("#xml2object"){
it("Convert xml string to object") {
val xml =
"""<job>
| <id>id1</id>
| <title>title1</title>
| <desc>desc1</desc>
| <industry>sales</industry>
|</job>""".stripMargin
val job1 = fromXML(xml).asInstanceOf[Job]
job1.title should be ("title1")
}
}
describe("#object2xml"){
it("Convert object to xml string") {
val job1 = Job("id1","title1","desc1","sales")
val expect =
"""<job>
| <id>id1</id>
| <title>title1</title>
| <desc>desc1</desc>
| <industry>sales</industry>
|</job>""".stripMargin
val xml = toXML(job1)
xml should be (expect)
}
}
}

}


Tip
Warning Message
[warn] Class java.time.Duration not found - continuing with a stub.
[warn] Class java.time.Duration not found - continuing with a stub.
[warn] two warnings found

Solution:
Adding package dependency fixes the problem.
"org.joda" % "joda-convert" % "1.7",


References:
http://x-stream.github.io/tutorial.html
http://alvinalexander.com/scala/serializing-deserializing-xml-scala-classes

xml to object
https://github.com/takezoe/solr-scala-client

case class mapper
https://github.com/takezoe/solr-scala-client/blob/master/src/main/scala/jp/sf/amateras/solr/scala/CaseClassMapper.scala
### Java 中使用 Case When 结合 XML 解析 在Java中处理XML文件时,`case when`结构通常不会直接用于XML解析过程中。然而,在某些场景下,比如当需要根据XML节点的内容执行不同的逻辑分支时,可以在读取到特定元素后的业务逻辑里应用`switch-case`或`if-else`来模拟`case when`的行为。 对于SAX解析方式而言,可以通过继承`DefaultHandler`类并覆盖其方法如`startElement()`、`characters()`等来进行事件驱动式的解析[^1]。一旦获取到了所需的标签名或者属性值之后,则可以根据这些信息利用条件判断语句实施类似于SQL `CASE WHEN`的操作: ```java import org.xml.sax.Attributes; import org.xml.sax.SAXException; import org.xml.sax.helpers.DefaultHandler; public class MyXmlHandler extends DefaultHandler { private String currentTag; // 当前正在处理的标签名称 @Override public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException { this.currentTag = qName.toLowerCase(); switch (this.currentTag){ case "item": System.out.println("Start processing item..."); break; default: // Do nothing or handle other tags. } } @Override public void characters(char ch[], int start, int length) throws SAXException { String content = new String(ch, start, length).trim(); if (!content.isEmpty()) { switch(this.currentTag){ case "title": processTitle(content); break; case "description": processDescription(content); break; // Add more cases as needed... default: // Handle unexpected elements gracefully. } } } private void processTitle(String titleContent){ // Implement logic based on the value of 'title' System.out.printf("Processing Title: %s%n", titleContent); // Example usage similar to SQL CASE WHEN statement if ("specificValue".equals(titleContent)){ // Execute specific action for matching condition doSpecificActionForTitle(); } else{ // Fallback/default behavior performGeneralOperationOnTitles(); } } // Other methods like processDescription() and helper functions go here... } ``` 上述代码展示了如何在一个SAX处理器(`MyXmlHandler`)内部根据不同类型的XML元素调用相应的函数,并且在处理具体的数据项(例如<title>)时实现了类似SQL `CASE WHEN`的功能——即依据实际内容采取不同动作。 需要注意的是,这里展示的例子主要是为了说明概念;真实项目开发中应当考虑更多细节,包括但不限于错误处理机制以及性能优化等方面的工作[^2]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值