2016-06-13 129 views
3

我有一个包含几百消息像下面的XML文件,在检查站表示车的经过时间。简单的Scala的XML解析

<ttt:appMsg xmlns:ttt="railrt/ttt/v0100" channel="rct" id="019176" time="2016-06-08T06:01:01.260"> 
<rct:st prodDatum="2016-06-08" Number="62713"> 
    <pbpData pat="2016-06-08T04:28:02" pbpID="[email protected]" pdt="2016-06-08T04:28:02"/> 
    <pbpData pat="2016-06-08T04:28:11" pbpID="[email protected]" pdt="2016-06-08T04:28:13"/> 
    <pbpData pat="2016-06-08T04:28:31" pbpID="[email protected]" pdt="2016-06-08T04:28:31"/> 
    <pbpData pat="2016-06-08T04:28:40" pbpID="[email protected]" pdt="2016-06-08T04:28:41"/> 
    <pbpData pat="2016-06-08T04:28:47" pbpID="[email protected]" pdt="2016-06-08T04:28:49"/> 
    <pbpData pat="2016-06-08T04:28:56" pbpID="[email protected]" pdt="2016-06-08T04:28:56"/> 
    <pbpData pat="2016-06-08T04:29:04" pbpID="[email protected]" pdt="2016-06-08T04:29:06"/> 
    <pbpData pat="2016-06-08T04:29:25" pbpID="[email protected]" pdt="2016-06-08T04:29:29"/> 
    <pbpData pat="2016-06-08T04:29:38" pbpID="[email protected]" pdt="2016-06-08T04:29:40"/> 
    <pbpData pat="2016-06-08T04:29:51" pbpID="[email protected]" pdt="2016-06-08T04:29:54"/> 
    <pbpData pat="2016-06-08T04:30:08" pbpID="[email protected]" pdt="2016-06-08T04:30:13"/> 
    <pbpData pat="2016-06-08T05:59:18" pbpID="[email protected]" pdt="2016-06-08T05:59:18"/> 
    <pbpData pat="2016-06-08T06:00:28" pbpID="[email protected]" pdt="2016-06-08T06:00:28"/> 
    <pbpData pat="2016-06-08T06:01:19" pbpID="[email protected]" pdt="2016-06-08T06:01:19"/> 
    <pbpData pat="2016-06-08T06:01:41" pbpID="[email protected]" pdt="2016-06-08T06:01:41"/> 
    <pbpData pat="2016-06-08T06:01:56" pbpID="[email protected]" pdt="2016-06-08T06:01:56"/> 
    <pbpData pat="2016-06-08T06:02:09" pbpID="[email protected]" pdt="2016-06-08T06:02:09"/> 
    <pbpData pat="2016-06-08T06:02:16" pbpID="[email protected]" pdt="2016-06-08T06:02:16"/> 
</rct:st> 

我是新来斯卡拉,但是从我一直在读周围,有一个简单的方法(即,在几行代码)来分析这一点,并存入一个Car对象属性如ID(rat中的“Number”:st标签)和检查点列表(“pbpData”行,每个都由节点ID和两个时间变量标识)。

而且,你觉得有一种方法来保存格式为YYYY-MM-DDTHH这些时间:mm:ss的使用Scala为日期属性?我正在寻找周围,但只找到一个tutorial改变Java中的日期/时间格式,即只有真正解释了如何更改显示,我们有一个日期的方式,而我希望做相反:保存这个有趣地写日期/时间作为有效的Scala时间。

谢谢大家。

回答

1

标准Scala的XML解析器应该为几百行XML的做的好(有,对于要求更高的情况下,可能会更好其他的XML解析器):

case class Car(pat: String, pbpID: String, pdt: String) 
val xml = scala.xml.XML.loadString(<your xml as string or use loadFile>) 
xml \\ "pbpData" map { node => 
    Car(node \\ "@pat" text, node \\ "@pbpID" text, node \\ "@pdt" text) 
} 

这将提取的数据,但为了将日期转换为日期对象我建议将jodatime作为解析ISO日期的最佳选择。

+0

我会考虑的!非常感谢 – TedBee

2

的XTRACT库(https://github.com/lucidsoftware/xtract)可能是有用的。

在你的情况,你可以做类似

case class Car(pat: String, pbpID: String, pdt: String) 
object Car { 
    implicit val reader: XmlReader[Car] = (
    attribute[String]("pat") and 
    attribute[String]("pbpID") and 
    attribute[String]("pdt") 
)(apply _) 
} 

然后你可以让他们的一系列的东西,如

XMlReader.of[Seq[Car]].read(xml \\ "pbpData") 

有一个博客贴子,进入更多细节here

Discalaimer:我写的最XTRACT的,并且所提到的博客文章,并很清醒软件的员工。