解析非常大的XML懒洋洋地(Parsing very large xml lazily)

2019-07-03 12:36发布

我有一个巨大的XML文件(40个GBS)。 我想从中提取一些字段,而将整个文件加载到内存中。 有什么建议?

Answer 1:

与XMLEventReader的一个简单的例子基于对SAXParser的教程在这里 (如发表的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)
}


Answer 2:

用户的SAXParser ,它不会加载整个XML内存。 这里好的java例子,很容易可以在Scala中使用。



Answer 3:

如果你很高兴看着替代XML库,然后秤的Xml提供了三种主要拉解析的方法:

  1. 基于迭代器 -只需使用hasNext,旁边以获得更多项目
  2. 迭代函数 -提供了一个Iterator而是通过简单的路径标识树
  3. Iteratee基于 -允许的多条路径组合

即将0.5版本的焦点是通过阿尔托的XML解析异步,允许附加的非阻塞控制选项。

在任何情况下,你可以同时控制内存的使用和文档如何与尺度处理。



文章来源: Parsing very large xml lazily