Scala - 将XML附加到文件

时间:2012-05-09 23:48:14

标签: xml file scala append

我正在Scala中创建一个简单的Web服务器,我正在尝试将事件记录到XML文件中。因此,XML结构是:

<log>
      <event>
             <type>Info/Warning/Error/etc</type>
             <description>File not found etc</description>
             <file>/etc/etc.etc</file>
             <ip>1.2.3.4</ip>
             <time>12:34:56 1st Jan 2012</time>
      </event>
      <event>
             etc...
      <event>
</log>

目前我正在尝试将XML写入这样的文件:

var logEvent = 
    <log>
<event>
<type>ERROR</type>
<description>The Requested File was not found</description>
<file>{path}</file>
<ip>{connection.getRemoteSocketAddress}</ip>
<time>{new Date(System.currentTimeMillis)}</time>
</event>
</log>

XML.save(logFile, logEvent, "UTF-8", true, null)

但是,当我检查文件时,只有最近的文件,并且在服务器运行时刷新文件显示每个事件都替换文件中的最后一个。

我还尝试使用FileOutputStreamXML.write一起启用追加,但是在每个事件之前插入XML架构,这会阻止它被识别为正确的XML文件。它还会在每个事件周围添加根<log>标记。

我能想到的唯一方法是在文件中加载当前的XML,添加它然后再写回来,这对我来说似乎效率很低。

有没有一种简单的方法可以将XML附加到我缺少的文件中? 任何帮助表示赞赏:)

1 个答案:

答案 0 :(得分:0)

如果您以该格式附加其他日志,则您的文档将无效 XML,因为缺少顶级容器。
如果你不在乎,你可以简单地使用java.nio.channels.FileChannel。

import java.nio._
import java.io._

def appendToFile(f: File) {
  var foutstream: Option[FileOutputStream] = None
  lazy val foutchannel = foutstream.get.getChannel
  try {
    foutstream = Some(new FileOutputStream(f, true)
    val buffer = ByteBuffer.allocate(1024)
    "this text will be appended" foreach (buffer.put(_.toByte))
    buffer.flip
    foutchannel.write(buffer)
    foutchannel.close
    foutstream.get.close
  } catch {
    case e: Exception => e printStackTrace
  }
}