2012-05-07 13 views
0

私はScalaで動作しているが、どこから開始するのかわからない小さなフラットテキスト(txt)ファイルをXMLに変換することになっています。私はいろいろな方法を試しましたが、今のところ問題があります。私の ファイルは、いくつかの文字列といくつかの整数です。ScalaのtxtファイルをXMLに変換する

私はまだ非常に基本的なScalaを使用していますので、より簡単です!

お手数をおかけしますようお願い申し上げます。

+3

もっと多くの情報が必要です。あなたのテキストファイルはどのように見えますか?どんな種類のXMLを作りたいですか? –

+0

@RayToalが正しいです。しかし、私は最初にParser Combinatorを見てみることをお勧めします。これは外部DSLを作成する方法です。例えば、テキストファイルをスラップした後。さらなる使用法として、テキストからxmlにコンパイルするときにIterateeによってより多くの制御を与える可能性があります。 –

+0

@といくつかの文字列を含むファイルの場合、パターコンバイナーは過度になる可能性があります –

答えて

-3

私はあなたが何をしようとしているのか正確にはわかりません。あなただけの値をラップしたい場合は、これと同様のことを行う可能性があります:

def string2xml[A](a: A): String = a match { 
    case s: String => "<String>" + s + "</String>" 
    case i: Int => "<Int>" + i + "</Int>" 
    case any => "<Any>" + any + "</Any>" 
} 
+0

テキストファイルの値には、あなたが正しいと思います。 –

+0

はい、そうです。しかし、ケースをいくつかのRegexで置き換えることもできます。私が言ったように、あなたが何をしようとしているのか分からない。 –

+0

文字列でXMLを作成するのではなく、ScalaのビルトインXMLリテラルを使用する必要があります。 –

4

これにはいくつかのステップがあります。

まず、データの形式に依存しない構造を決定し、このデータを保持するScalaクラスを作成します。次に、このデータがテキストファイルでどのように書式設定されているかを調べ、テキストファイルを解析してクラス(または場合によってはそのクラスのリスト)にデータを入力するルーチンを作成します。最後に、XMLファイルのスキーマを見つけ出し、ScalaのXMLリテラルを使用してXMLファイルにデータを書き込みます。

あなたのデータが人の名前、年齢、身長、体重で構成されているとします。データがどのように見えることができることを保持するために、Scalaのクラス:テキストファイルで

case class Person(name: String, age: Int, height: Double, weight: Double) 

が、これは単純なものから、いくつかの方法で表現することができます

Peter 
34 
178.2 
83.2 

または「プロパティ」スタイルのフォーマット:

name = Peter 
age = 34 
weight = 178.2 
height = 83.2 

または最も可能性の高いCSV形式、あなたが1つのファイルに複数の人物がある場合:

Peter,34,178.2,83.2 
Tom,53,182.3,95.3 
John,27,175.1,74.5 
0を

例として最後のフォーマットを考えてみましょう。ファイルを読むための最も簡単な方法は、このようなものです:

val persons = lines map { line => 
    val elements = line split "," 
    Person(elements(0), elements(1).toInt, elements(2).toDouble, elements(3).toDouble) 
} 

は、いくつかのまともなXMLにそれを回すためにPersonクラス上の素敵なメソッドを追加します:

val lines = io.Source.fromFile(new java.io.File("test.txt")).getLines.toList 

が続い人にそれぞれの行を解析

def toXml = 
     <person> 
      <name>{ name }</name> 
      <age>{ age }</age> 
      <height>{ height }</height> 
      <weight>{ weight }</weight> 
     </person> 

そして最後にXMLに人物のリストをマップ:

val personsXml = <persons>{ persons map(_.toXml) }</persons> 

そしてファイルに書き込む:

new java.io.FileOutputStream(new java.io.File("test.xml")).write(personsXml.toString.getBytes) 

なお、エラー処理やファイルの適切な閉鎖は読者の課題として残されています! :)

関連する問題