2012-05-07 93 views
0

我應該將一個小的平面文本(txt)文件轉換爲XML,以用於我在Scala中運行的程序,但不知道從哪裏開始。我嘗試了各種方法,但到目前爲止遇到了麻煩。我的 文件是幾個字符串和幾個整數。在Scala中將txt文件轉換爲XML

我仍然使用非常基本的Scala,所以越簡單越好!

在此先感謝任何有幫助的人。

+3

我們需要更多的信息。你的文本文件是什麼樣的?你想要製作什麼樣的XML? –

+0

@RayToal是對的。不過,我建議你首先看看Parser Combinator,這是一種創建外部DSL的方法;例如在誹謗文本文件之後。對於進一步的用法,你可能會被Iteratee抓住,這將給你更多的控制,同時從文本編譯到xml –

+0

@andypetrella對於帶有幾個字符串的文件解析器組合器可能是一個過度衝擊 –

回答

-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

是的你是對的。但你也可以用一些正則表達式替換這些情況。正如我所說,我不知道你在做什麼。 –

+0

您應該使用Scala的內置XML文字,而不是用字符串組合XML。 –

4

有幾個步驟。

首先,我要確定數據的格式無關結構並創建一個Scala類來保存這些數據。然後我會弄清楚這些數據是如何在文本文件中格式化的,然後編寫一個例程來解析文本文件並用數據填充類(或者可能是該類的列表)。最後,找出XML文件的模式並使用Scala的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格式,如果你在一個文件中的幾個人:

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

讓我們以最後一種格式爲例。讀取文件的最簡單的方法是這樣的:

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

然後分析每一行到一個人身上:

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

添加在Person類一個不錯的方法,把它變成一些體面的XML:

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) 

注意,錯誤處理和文件的正確關閉就留給讀者自己練習! :)