私は巨大なxmlファイル(40 gbs)を持っています。ファイル全体をメモリにロードせずに、そこからいくつかのフィールドを抽出したいと思います。助言がありますか?
質問する
9382 次
3 に答える
22
SAXParserのチュートリアルに基づく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)
}
于 2012-11-02T10:46:22.010 に答える
2
代替のxmlライブラリを見て満足している場合、ScalesXmlは3つの主要なプル解析アプローチを提供します。
- イテレータベース-次のhasNextを使用するだけで、さらに多くのアイテムを取得できます
- iterate関数-イテレータを提供しますが、単純なパスで識別されるツリーに使用します
- Iterateeベース-複数のパスの組み合わせが可能
今後の0.5バージョンの焦点は、aalto-xmlを介した非同期解析であり、追加の非ブロッキング制御オプションを可能にします。
すべての場合において、メモリ使用量とドキュメントがスケールで処理される方法の両方を制御できます。
于 2012-11-04T23:01:41.220 に答える