简单Scala XML解析
我有一个XML文件,其中包含数百条如下消息,表示车辆在检查站的通行时间简单Scala XML解析,xml,scala,date,parsing,xml-parsing,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
<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,但从我所阅读的内容来看,有一种简单的方法(即,在几行代码中)可以解析并存储到汽车对象属性中,如ID(“rat:st标记中的数字”)和检查点列表(“pbpData”行,每个行由一个节点ID和两个时间变量标识)
此外,您认为有没有办法以YYYY-MM-DDThh:MM:ss格式保存这些时间,并使用Scala作为日期属性?我四处搜索,但只找到了一个在Java中更改日期/时间格式的方法,这只真正解释了如何更改日期的显示方式,而我想做的恰恰相反:将这个写得很有趣的日期/时间保存为有效的Scala时间
谢谢大家。标准Scala XML解析器应该适用于几百行XML(对于要求更高的情况,还有其他XML解析器可能更好):
case-class-Car(pat:String,pbpID:String,pdt:String)
val xml=scala.xml.xml.loadString()
xml\\“pbpData”映射{node=>
Car(节点\\“@pat”文本,节点\\“@pbpID”文本,节点\\“@pdt”文本)
}
这将提取数据,但为了将日期转换为日期对象,我建议使用jodatime作为解析ISO日期的最佳选项。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")
然后你可以得到一个序列,比如
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")
有一篇博文详细介绍了这一点
Discalaimer:我写了大部分的Extract和提到的博客文章,我是Lucid软件的员工