树解析器vs流解析器

时间:2013-08-22 14:13:06

标签: android parsing battery

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

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

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

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

1 个答案:

答案 0 :(得分:1)

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

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

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

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

如果您正在寻找使用文本的一小部分的特定信息,例如在DOM或XML文档中查找第一个标记,则可能采用流方法。

另一方面,如果您需要找到所有标签,以及您可能会认为是对文档进行多次概念传递的各种标签,或者您是否会回到该文本/ tree一遍又一遍,然后你可能想要解析一次并解决生成的树而不是对文本进行多次遍历。

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

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

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