2016-06-13 12 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> 

私はスカラ座に新しいですが、私は周りに読んでいたものから、(数行のコードで、すなわち)簡単な方法があるが、これを解析し、車のオブジェクトに格納しますID(rat:stタグのNumber)とチェックポイントのリスト(「pbpData」行、それぞれノードIDと2つの時間変数で識別される)のような属性です。

また、日付属性としてScalaを使用してYYYY-MM-DDThh:mm:ssの形式でこれらの時刻を保存する方法があると思いますか?私は周りを検索していたが、Javaで日付/時刻の形式を変更するためのtutorialしか見つかりませんでしたが、これは逆のことをしたいのに対し、有効なScala時間として使用します。

ありがとうございました。 XMLの100行のカップルのために良いやるべき

答えて

1

標準Scalaの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) 
} 

このデータを抽出しますが、順番になります日付を日付オブジェクトに変換するには、ISO-dateを解析するための最良のオプションとしてjodatimeを提案します。

+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に入るのブログ記事がありますのようなものでそれらのシーケンスを得ることができます。

Discareaimer:私はXtractの大部分とブログ記事を書きましたが、Lucid Softwareの従業員です。