如何在Scala中生成格式良好的XML?
假设您定义了以下内容:如何在Scala中生成格式良好的XML?,scala,Scala,假设您定义了以下内容: class Person(name: String, age: Int) { def toXml = <person> <name>{ name }</name> <age>{ age }</age> </person> } val Persons = List(new Person("John", 34)
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))
class-Person(姓名:String,年龄:Int){
def-toXml=
{name}
{age}
}
val Persons=列表(新人(“约翰”,34岁),新人(“鲍勃”,45岁))
然后生成一些XML并将其保存到文件:
val personsXml =
<persons>
{ persons.map(_.toXml) }
</persons>
scala.xml.XML.save("persons.xml", personsXml)
val personsXml=
{persons.map(u.toXml)}
scala.xml.xml.save(“persons.xml”,personsXml)
最后,您将看到以下看起来很有趣的文本:
<persons>
<person>
<name>John</name>
<age>32</age>
</person><person>
<name>Bob</name>
<age>43</age>
</person>
</persons>
约翰
32
上下快速移动
43
当然,这是完全有效的XML,但是如果您希望它在一个像样的文本编辑器中可以人工编辑,那么最好将其格式化得稍微好一点
通过更改Scala XML文本各个点上的缩进(使代码看起来不那么漂亮),可以生成上述输出的变体,但似乎不可能完全正确。我理解它为什么会以这种方式格式化,但不知道是否有办法解决它。您可以使用它来格式化。遗憾的是,这不适用于大型文档,因为它只格式化为
StringBuilder
,而不直接写入流或写入程序。我找不到使用预打印程序的方法,也无法直接指定文件编码。我找到的“解决方案”是:
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
}
val Encoding=“UTF-8”
def save(节点:节点,文件名:字符串)={
val pp=新的预印字机(80,2)
val fos=新文件输出流(文件名)
val writer=Channels.newWriter(fos.getChannel(),编码)
试一试{
writer.write(“\n”)
writer.write(pp.format(节点))
}最后{
writer.close()
}
文件名
}
也许它会有用。
当您使用文本编辑器时,尽量不要在XML代码中放置任何额外的选项卡,因为它们将保存在XML文件中
我的意思是,您的代码应该如下所示:
val personsXml =
<persons>
{ persons.map(_.toXml) }
</persons>
val personsXml=
{persons.map(u.toXml)}
与此相反:
val personsXml =
<persons>
{ persons.map(_.toXml) }
</persons>
val personsXml=
{persons.map(u.toXml)}
这对我来说非常有效。谢谢你提出了“预印机”的想法。这帮了大忙
我找到了将XML元素写入具有适当缩进的文件的方法
val xmlData = // your xml here
// max width: 80 chars
// indent: 2 spaces
val printer = new scala.xml.PrettyPrinter(80, 2)
XML.save("yourFileName.xml", XML.loadString(printer.format(musicMarshaledXML)) , "UTF-8", true, null)
非常感谢有关此实现的性能或任何缺点的任何反馈(使用“XML.save()”)改编自和
def cleanXml(xml:String):String={
导入org.w3c.dom.Node
导入org.w3c.dom.bootstrap.DOMImplementationRegistry
导入org.w3c.dom.ls.dom实现
导入org.w3c.dom.ls.LSSerializer
导入org.xml.sax.InputSource
导入javax.xml.parsers.DocumentBuilderFactory
导入java.io.StringReader
val src=新输入源(新StringReader(xml))
val document=DocumentBuilderFactory.newInstance().newDocumentBuilder().parse(src).getDocumentElement
val keepDeclaration=java.lang.Boolean.valueOf(xml.startsWith(“这是一个mod to answer,可以写入非本地目录的目标位置:
val printer = new PrettyPrinter(80, 2)
val targetFile = new java.io.File("./mytargetdir/file.xml")
val prettyDoc = printer.format(document)
val writer = new java.io.FileWriter(targetFile)
scala.xml.XML.write(writer, XML.loadString(prettyDoc), "UTF-8", true, null)
org.apache.commons.io.IOUtils.closeQuietly(writer);
我使用XML.write对这种方法进行了改进,以便指定目标目录。
val printer = new PrettyPrinter(80, 2)
val targetFile = new java.io.File("./mytargetdir/file.xml")
val prettyDoc = printer.format(document)
val writer = new java.io.FileWriter(targetFile)
scala.xml.XML.write(writer, XML.loadString(prettyDoc), "UTF-8", true, null)
org.apache.commons.io.IOUtils.closeQuietly(writer);