Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在Scala中生成格式良好的XML?_Scala - Fatal编程技术网

如何在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);