寻找关于树解析器与流解析器的解释。
从我一直在研究 android 中的 JSON 内置解析器来看,它是一个树解析器,而 Jackson Json 解析器是一个流解析器。此外,android 的 xml pull 解析器是一个流解析器。
我的问题是什么是树解析器,你能解释一下流解析器和树解析器之间的区别吗?来自 Google I/O 的演讲者提到树解析器会占用更多的电池生命周期,应该避免使用流解析器。
更新:树解析器是否等于 Dom 解析器?我的意思是条款是一样的吗?
最佳答案
树解析器返回文本的完整解析。因此,在整个文本被解析之前它不会给出答案。
相反,流解析器在处理文本时返回信息。如果您愿意,则由您决定 build 一棵树。在算法中,这种差异是所谓的批处理或离线算法(树解析)与在线算法(流解析器)之间的差异。
见 What's the difference between an on-line and off-line algorithm? .
那么,为什么要选择一个而不是另一个呢? Google I/O 演讲者提到了电池生命周期。但这是更一般的原则的结果,您需要更多的内存来存储整个文本的树,并且需要更多的处理时间来读取整个文本(假设流解析器可以提前退出)。
如果您正在寻找使用一小部分文本的特定信息,例如在 DOM 或 XML 文档中查找第一个标签,那么流方法可能是您的最佳选择。
另一方面,如果您需要查找所有标签和各种标签,您可能会认为这些标签是文档中的几个概念传递,或者如果您会一遍又一遍地回到该文本/树,那么您可能想要解析一次并处理结果树,而不是对文本进行多次传递。
同样,如果您需要的信息最好通过将问题视为树来回答:从子节点、兄弟节点和/或祖先节点获取或传递信息,那么您可能想要采用树方法。但...
从理论上讲,您始终可以通过在进行过程中构建树来将流解析器转换为树解析器。这是您必须编写的额外代码。
流解析器和树解析器之间的区别就像 Python 迭代器/生成器与列表(相当于 Ruby 枚举与数组)之间的区别。
关于android - 树解析器与流解析器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18382957/