SAX解析器与XMLPull解析器

时间:2011-04-27 17:27:47

标签: android xml saxparser xmlpullparser

我理解SAX解析器的工作方式与XMLPull解析器之间的区别。 事实上,这里有一个很好的解释:

http://www.firstobject.com/xml-reader-sax-vs-xml-pull-parser.htm 这篇文章有点以.NET为中心,但概念适用。

虽然我同意作者认为Pull解析器更容易使用的观点,但我很困惑哪种类型的解析器在哪种情况下会更好。 如果有人可以放弃任何光线并指出我更多的阅读,我会很感激。

谢谢。

7 个答案:

答案 0 :(得分:16)

我发现他们都很糟糕。 (我有一个更好的解决方案建议)

您应该使用Simple annotation based XML library。我喜欢它并将其用于我的所有项目。如果你read through the tutorial那么我认为你会发现它能够以更快的速度和更少的代码完成你想要的一切。 (因此不易出错)在内部,库使用那些你要求解决的解析器。

如果需要,您可以阅读我的blog post on including it in an Android project。 (它将适用于Android的每个版本,从至少1.5起,基本上对每个人都意味着)

答案 1 :(得分:9)

这完全取决于情况,例如,如果xml文件真的很大,你不能选择DOM解析器,因为他们将首先将文件带入内存然后它将被解析,我发现解析文件大小为n需要7n内存空间。在这种情况下,您应该选择SAX解析器,并消耗更少的内存。

第二种情况是当文件不是很大时,在这种情况下你可以使用XML pull解析器,因为在这里你可以完全控制xml,你可以在SAX中无法实现的任何地方跳过解析周期。因此,如果您要查找的标签是文件中的第一个标签,那么为什么要使用整个文件。

据我所知,如果你只考虑使用小文件的速度,请使用XML pull解析器,如果文件很大并且你想要解析它,那么请使用SAX。

答案 2 :(得分:2)

两个解析器基本上都是相同的内存/时间。 唯一的事情就是使用pull解析器,你可以提取诸如startelement和endelement之类的事件,并且只注意你想要的事件。

与android sax解析器一样,你别无选择,只需将代码放在你想要的位置,但你必须包含所有事件。

here是一个链接,您可以参考以供进一步阅读。

答案 3 :(得分:2)

Pull和Sax的方式相似,它们都是低级流媒体方法,比DOM更快,内存效率更高,但是拉有一些优于SAX的优势:

Pull比SAX更容易实现,因为您不必维护解析器的状态(使用其他变量来了解解析器当前在XML树中的位置)。拉解析器代码中的嵌套循环将或多或少地与文档的XML层次结构匹配,因此我认为Pull解析器代码也比SAX解析器代码更具可读性。

使用pull解析器代码,您可以跳过您不想解析的整个块,因此它也比SAX更有效,SAX总是提取所有节点的主要信息。使用拉解析器,如果您获取了所需的信息,也可以随时停止解析,这是SAX无法实现的。

此外,您可以使用pull解析器实现SAX解析器。相反是不可能的。

由于所有这些原因,我认为拉解析器在所有情况下都优于SAX,但是像SAX一样,正确实现并不是一件容易的事情,你必须要小心。如果您不需要pull和SAX的低级速度优势并且您的XML是干净的,那么您始终可以使用更高级别的解析库(如Simple)为您完成艰苦的工作。

答案 4 :(得分:1)

我发现SAX模型在某种特定情况下更容易使用:您将使用自定义数据结构在整个文档(或至少其主要部分)中构建自己的内存中表示。 (如果您不是特别关注数据结构,那么DOM解析器已经这样做了。)

答案 5 :(得分:0)

我在使用SAX而不是XMLPullParser时找到了更好更高效的输出...我的方案是解析XML标记下的属性,我可以轻松地将其轻松地插入数据库...我认为这取决于情况,当我需要在XML文件上写时,我更喜欢DOM Parser ......

function palindrome(str) {
    str = str.replace(/[^\w]/g, "").toLowerCase();
    var reverseStr = str.split("").reverse().join('');
    var result = (str === reverseStr);
    log(str + ": " + reverseStr + ": " + result);
    return result;
}

function log(x) {
    var d = document.createElement("div");
    d.textContent = x;
    document.body.appendChild(d);
}

palindrome("eye");
palindrome("race car");
palindrome("not a palindrome"); //not working for this str.
palindrome("A man, a plan, a canal. Panama");
palindrome("never odd or even");
palindrome("nope");  //not working for this str.

答案 6 :(得分:-1)

我建议使用XmlPullParser一个.. Sax解析器没有从我的测试中的feed中检索标记.. xmlpullparser很容易做到这一点=) 也取决于你的喜好