2016-06-13 64 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的,並且所提到的博客文章,並很清醒軟件的員工。