2012-05-07 43 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) 

注意,错误处理和文件的正确关闭就留给读者自己练习! :)