如何在Scala中生成格式良好的XML?

Knu*_*daa 21 scala

假设您定义以下内容:

class Person(name: String, age: Int) {
    def toXml =
        <person>
            <name>{ name }</name>
            <age>{ age }</age>
        </person>   
}

val Persons = List(new Person("John", 34), new Person("Bob", 45))
Run Code Online (Sandbox Code Playgroud)

然后生成一些XML并将其保存到文件中:

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

scala.xml.XML.save("persons.xml", personsXml)
Run Code Online (Sandbox Code Playgroud)

你最终得到了以下有趣的文字:

<persons>
        <person>
            <name>John</name>
            <age>32</age>
        </person><person>
            <name>Bob</name>
            <age>43</age>
        </person>
    </persons>
Run Code Online (Sandbox Code Playgroud)

当然,现在,这是完全有效的XML,但是如果你想在一个体面的文本编辑器中进行人工编辑,那么最好将它格式化得更好一些.

通过更改Scala XML文字的各个点上的缩进 - 使代码看起来不那么好 - 可以生成上述输出的变体,但似乎不可能完全正确.我理解为什么它会以这种方式格式化,但想知道是否有任何方法可以解决它.

Mor*_*itz 21

您可以使用scala.xml.PrettyPrinter对其进行格式化.遗憾的是,这不适用于大型文档,因为它只能格式化为a StringBuilder并且不会直接写入流或编写器.


ger*_*rra 14

我找不到使用PrettyPrinter的方法,也直接指定文件编码.我发现的"解决方案"是这样的:

val Encoding = "UTF-8"

def save(node: Node, fileName: String) = {

    val pp = new PrettyPrinter(80, 2)
    val fos = new FileOutputStream(fileName)
    val writer = Channels.newWriter(fos.getChannel(), Encoding)

    try {
        writer.write("<?xml version='1.0' encoding='" + Encoding + "'?>\n")
        writer.write(pp.format(node))
    } finally {
        writer.close()
    }

    fileName
}
Run Code Online (Sandbox Code Playgroud)