【发布时间】:2012-10-22 11:04:49
【问题描述】:
我有一个巨大的 xml 文件 (40 gbs)。我想从中提取一些字段而不将整个文件加载到内存中。有什么建议吗?
【问题讨论】:
-
看看scala的XMLEventReader
标签: scala xml-parsing
我有一个巨大的 xml 文件 (40 gbs)。我想从中提取一些字段而不将整个文件加载到内存中。有什么建议吗?
【问题讨论】:
标签: scala xml-parsing
基于 SAXParser here 的教程的 XMLEventReader 快速示例(由 Rinat Tainov 发布)。
我确信它可以做得更好,但只是为了展示基本用法:
import scala.io.Source
import scala.xml.pull._
object Main extends App {
val xml = new XMLEventReader(Source.fromFile("test.xml"))
def printText(text: String, currNode: List[String]) {
currNode match {
case List("firstname", "staff", "company") => println("First Name: " + text)
case List("lastname", "staff", "company") => println("Last Name: " + text)
case List("nickname", "staff", "company") => println("Nick Name: " + text)
case List("salary", "staff", "company") => println("Salary: " + text)
case _ => ()
}
}
def parse(xml: XMLEventReader) {
def loop(currNode: List[String]) {
if (xml.hasNext) {
xml.next match {
case EvElemStart(_, label, _, _) =>
println("Start element: " + label)
loop(label :: currNode)
case EvElemEnd(_, label) =>
println("End element: " + label)
loop(currNode.tail)
case EvText(text) =>
printText(text, currNode)
loop(currNode)
case _ => loop(currNode)
}
}
}
loop(List.empty)
}
parse(xml)
}
【讨论】:
如果您对替代 xml 库感到满意,那么 Scales Xml 提供了三种主要的拉式解析方法:
即将发布的 0.5 版本的重点是通过 aalto-xml 进行异步解析,允许额外的非阻塞控制选项。
在所有情况下,您都可以控制内存使用以及使用 Scales 处理文档的方式。
【讨论】: