我有一个30MB的大型XML文件,并希望在其中找到几个元素.
该文件是一个有效的pom.xml,我想从中获取所有依赖项(名称,组,版本),子模块和父项.您可以使用查看此类文件
mvn help:effective-pom -Doutput=test.xml
Run Code Online (Sandbox Code Playgroud)
对于我的26MB文件,scala的XML.load*导致java.lang.OutOfMemoryError:Java堆空间
除了增加堆空间,我还能做些什么?
TIA,bastl.
您可以使用pull解析,其中XML元素被视为一系列事件(开放标记a
,开放标记i
,文本,关闭标记i
,......).
这样可以避免将整个文件存储在内存中.
我已经在数百MB的XML文件上使用它而没有任何重大问题.(当然,正如Rex在评论中指出的那样,如果要恢复的元素本身就很庞大,那么就没有明显的方法了.)
pull解析器不像"常规"(或反XML)那样方便,因为它不会给你一棵树.相反,您必须管理状态以跟踪您在文档中的位置.
这是一个自包含的示例,演示如何在Scala的Wikipedia页面上提取所有内部链接:
import scala.xml.Text
import scala.xml.pull._
import scala.io.Source
val src = Source.fromURL("http://en.wikipedia.org/wiki/Scala_(programming_language)")
val reader = new XMLEventReader(src)
val Internal = """/wiki/([\w_]*)""".r
var inLink = false
var linksTo = ""
for(event <- reader) {
event match {
case EvElemStart(_, "a", meta, _) => meta("href") match {
case Text(Internal(href)) =>
linksTo = href
inLink = true
case _ =>
}
case EvText(txt) if inLink => println(txt + " --> " + linksTo)
case EvElemEnd(_, "a") => inLink = false
case _ => ;
}
}
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
1984 次 |
最近记录: |