【问题标题】:tree parser vs stream parser树解析器与流解析器
【发布时间】:2013-08-22 14:13:05
【问题描述】:

寻找关于树解析器与流解析器的解释。

我一直在研究 android 中的 JSON 内置解析器是一个树解析器,而 Jackson Json 解析器是一个流解析器。还有,android的xml pull parser是一个stream parser。

我的问题是什么是树解析器,您能解释一下流解析器和树解析器之间的区别吗? Google I/O 演示者提到树解析器会占用更多电池寿命,应避免使用流解析器。

更新:树解析器是否等于 Dom 解析器?我的意思是条款是一样的吗?

【问题讨论】:

  • 简而言之:树解析器将加载整个数据并对其进行解析,流解析器将分块执行并仅转发(在树解析器中,您可以访问所有元素 - 仅在流中到当前)。 .. 我不知道它与电池寿命的关系,但流解析器“吃掉”更少的内存
  • 树解析器等于Dom解析器吗?我的意思是条款是一样的吗?

标签: android parsing battery


【解决方案1】:

树解析器返回对文本的完整解析。因此,在整个文本被解析之前它不会给出答案。

相比之下,流解析器在处理文本时会返回信息。如果您愿意,则由您决定建造一棵树。在算法中,这种区别就是所谓的批处理或离线算法(树解析)与在线算法(流解析器)之间的区别。

What's the difference between an on-line and off-line algorithm?

那么,为什么你会选择一个而不是另一个呢? Google I/O 演讲者提到了电池寿命。但这是一个更普遍的原则的结果,您需要更多的内存来存储整个文本的树,并且需要更多的处理时间来读取整个文本(假设流解析器可以提前退出)。

如果您正在查找使用一小部分文本的特定信息,例如在 DOM 或 XML 文档中查找第一个标签,那么流方法可能是您的最佳选择。

另一方面,如果您需要找到所有标签和各种标签,您可能会认为这些标签在文档中进行了多次概念传递,或者如果您将返回该文本/tree 一遍又一遍,那么您可能想要进行一次解析并处理生成的树,而不是对文本进行多次传递。

类似地,如果您需要的信息类型最好通过将问题视为树来回答:从子节点、兄弟节点和/或祖先节点获取或传递信息,那么您可能想要使用树方法。但是……

理论上,您可以随时通过构建树的工作将流式解析器转变为树解析器。这是您必须编写的额外代码。

流解析器和树解析器之间的区别就像 Python 迭代器/生成器与列表(相当于 Ruby 枚举与数组)之间的区别。

【讨论】:

  • 你会说json解析总是树解析吗?和 xml 可以是树解析还是流解析?我无法将被解析为流的 json 可视化,所以我想总结一下它的总是树解析。
  • 树解析器,尤其是快速解析器,通常会从输入中顺序(或类似流)读取其树。它只是不必一路运行回调。流 vs. 树则更多的是需要提供的操作,而不是文本是否按顺序读取。
猜你喜欢
  • 2011-08-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-05-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多