相关疑难解决方法(0)

SAX和DOM有什么区别?

我阅读了一些关于XML解析器的文章,并且遇到了SAXDOM.

SAX是基于事件的,DOM是树模型 - 我不理解这些概念之间的差异.

根据我的理解,基于事件意味着某种事件发生在节点上.就像当单击特定节点时,它将给出所有子节点,而不是同时加载所有节点.但是在DOM解析的情况下,它将加载所有节点并创建树模型.

我的理解是否正确?

请纠正我如果我错了或以更简单的方式向我解释基于事件和树模型.

saxparser xml-parsing domparser

237
推荐指数
7
解决办法
22万
查看次数

为什么sax解析比dom解析更快?stax是如何工作的?

有点相关:来自java的libxml2

是的,这个问题相当啰嗦 - 对不起.我保持尽可能密集.我把问题加粗了,以便在阅读整篇文章之前更容易窥视.

为什么sax解析比dom解析更快? 我唯一能想到的是w/sax你可能忽略了大部分传入数据,因此不会浪费时间处理你不关心的xml部分.IOW - 解析w/SAX后,无法重新创建原始输入. 如果您编写SAX解析器以便它占据每个xml节点(并因此可以重新创建原始节点),那么它不会比DOM更快吗?

我问的原因是我正在尝试更快地解析xml文档.我需要在解析后访问整个xml树.我正在编写一个插入第三方服务的平台,所以我无法预测xml文档的哪些部分需要以及哪些部分不需要.我甚至不知道传入文件的结构.这就是为什么我不能使用jaxb或sax.内存占用对我来说不是问题,因为xml文档很小,我一次只需要1个内存.这是解析这个相对较小的xml文档所花费的时间.我之前没有使用过stax,但也许我需要进一步调查,因为它可能是中间地带? 如果我理解正确, 通过这种方式,原始的解析时间可能很快,但每次我要求它遍历尚未遍历的树的一部分时,就是处理发生的时候?

如果您提供了回答大多数问题的链接,我会接受您的回答(如果他们已在其他地方回答,您无需直接回答我的问题).

更新:我在sax中重写了它,并在avg 2.1 ms上解析文档.这比dom所采用的2.5毫秒有所改善(快16%),但这并不是我(等人)猜到的那么大.

谢谢

java xml stax dom sax

11
推荐指数
3
解决办法
2万
查看次数

为什么ReversedLinesFileReader这么慢?

我有一个21.6GB的文件,我想从头到尾阅读它,而不是像往常一样从开头到结尾.

如果我使用以下代码从头到尾读取文件的每一行,则需要1分12秒.

val startTime = System.currentTimeMillis()
File("very-large-file.xml").forEachLine {
    val i = 0
}
val diff = System.currentTimeMillis() - startTime
println(diff.timeFormat())
Run Code Online (Sandbox Code Playgroud)

现在,我已经读过要反向读取文件然后我应该使用ReversedLinesFileReaderApache Commons.我创建了以下扩展函数来做到这一点:

fun File.forEachLineFromTheEndOfFile(action: (line: String) -> Unit) {
    val reader = ReversedLinesFileReader(this, Charset.defaultCharset())
    var line = reader.readLine()
    while (line != null) {
        action.invoke(line)
        line = reader.readLine()
    }

    reader.close()
}
Run Code Online (Sandbox Code Playgroud)

然后以下面的方式调用它,这与前面的方式相同,只是调用forEachLineFromTheEndOfFile函数:

val startTime = System.currentTimeMillis()
File("very-large-file.xml").forEachLineFromTheEndOfFile {
    val i = 0
}
val diff = System.currentTimeMillis() - startTime
println(diff.timeFormat())
Run Code Online (Sandbox Code Playgroud)

这需要17分50秒才能运行!

  • ReversedLinesFileReader是以正确的方式使用的吗?
  • 我在SSD上运行带有Ext4文件系统的Linux …

java kotlin apache-commons-io

5
推荐指数
1
解决办法
2146
查看次数

标签 统计

java ×2

apache-commons-io ×1

dom ×1

domparser ×1

kotlin ×1

sax ×1

saxparser ×1

stax ×1

xml ×1

xml-parsing ×1