加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

scala – 懒惰地解析非常大的xml

发布时间:2020-12-16 09:27:53 所属栏目:安全 来源:网络整理
导读:我有一个巨大的xml文件(40 gbs).我想从中提取一些字段而不将整个文件加载到内存中.有什么建议么? 解决方法 基于SAXParser here教程的XMLEventReader的快速示例(由Rinat Tainov发布). 我确信它可以做得更好但只是为了显示基本用法: import scala.io.Sourcei
我有一个巨大的xml文件(40 gbs).我想从中提取一些字段而不将整个文件加载到内存中.有什么建议么?

解决方法

基于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","company") => println("Last Name: " + text)
      case List("nickname","company") => println("Nick Name: " + text)
      case List("salary","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)
}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读