简单的Scala XML解析

时间:2016-06-13 11:59:37

标签: xml scala date parsing xml-parsing

我有一个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="RY@P121" pdt="2016-06-08T04:28:02"/>
    <pbpData pat="2016-06-08T04:28:11" pbpID="RY@P5215" pdt="2016-06-08T04:28:13"/>
    <pbpData pat="2016-06-08T04:28:31" pbpID="RY@P5221" pdt="2016-06-08T04:28:31"/>
    <pbpData pat="2016-06-08T04:28:40" pbpID="RY@P5223" pdt="2016-06-08T04:28:41"/>
    <pbpData pat="2016-06-08T04:28:47" pbpID="RY@P5233" pdt="2016-06-08T04:28:49"/>
    <pbpData pat="2016-06-08T04:28:56" pbpID="RY@P5241" pdt="2016-06-08T04:28:56"/>
    <pbpData pat="2016-06-08T04:29:04" pbpID="RY@P5243" pdt="2016-06-08T04:29:06"/>
    <pbpData pat="2016-06-08T04:29:25" pbpID="RY@P5245" pdt="2016-06-08T04:29:29"/>
    <pbpData pat="2016-06-08T04:29:38" pbpID="RY@P5247" pdt="2016-06-08T04:29:40"/>
    <pbpData pat="2016-06-08T04:29:51" pbpID="RY@P5253" pdt="2016-06-08T04:29:54"/>
    <pbpData pat="2016-06-08T04:30:08" pbpID="ER@P5261" pdt="2016-06-08T04:30:13"/>
    <pbpData pat="2016-06-08T05:59:18" pbpID="POLS@P127" pdt="2016-06-08T05:59:18"/>
    <pbpData pat="2016-06-08T06:00:28" pbpID="POLS@POLS31P" pdt="2016-06-08T06:00:28"/>
    <pbpData pat="2016-06-08T06:01:19" pbpID="POLS@POLS41P" pdt="2016-06-08T06:01:19"/>
    <pbpData pat="2016-06-08T06:01:41" pbpID="POLS@POLS316P" pdt="2016-06-08T06:01:41"/>
    <pbpData pat="2016-06-08T06:01:56" pbpID="POLS@POLS318P" pdt="2016-06-08T06:01:56"/>
    <pbpData pat="2016-06-08T06:02:09" pbpID="POLS@POLS320P" pdt="2016-06-08T06:02:09"/>
    <pbpData pat="2016-06-08T06:02:16" pbpID="BIA@POLS322P" pdt="2016-06-08T06:02:16"/>
</rct:st>

我是Scala的新手,但是从我一直在阅读的内容中,有一种简单的方法(即在几行代码中)来解析它并存储到Car对象属性中,如ID(“Number”)在rat:st标签中)和一个检查点列表(“pbpData”行,每个行由一个节点ID和两个时间变量标识)。

此外,您认为有一种方法可以将这些时间保存为YYYY-MM-DDThh:mm:ss并将Scala作为日期属性吗?我正在四处搜索,但只发现tutorial用于更改Java中的日期/时间格式,这只能真正解释如何更改我们所拥有的日期的方式,而我希望相反:保存这个有趣的书面日期/时间作为有效的Scala时间。

谢谢大家。

2 个答案:

答案 0 :(得分:3)

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和上述博客文章,并且是Lucid Software的员工。

答案 1 :(得分: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日期的最佳选择。