5

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

从我一直在研究 android 中的 JSON 内置解析器来看,它是一个树解析器,而 Jackson Json 解析器是一个流解析器。此外,android 的 xml pull 解析器是一个流解析器。

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

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

4

1 回答 1

4

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

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

请参阅在线和离线算法有什么区别?.

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

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

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

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

从理论上讲,您始终可以通过在进行过程中构建树来将流解析器转换为树解析器。这是您必须编写的额外代码。

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

于 2016-09-23T16:43:45.467 回答