21

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

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

虽然我同意作者的观点,即 Pull 解析器更易于使用,但我很困惑在哪种情况下哪种类型的解析器会更好。如果有人能阐明任何观点并指出我的更多阅读内容,我将不胜感激。

谢谢你。

4

7 回答 7

18

我发现他们俩都很烂。(而且我有更好的解决方案建议)

您应该使用基于简单注释的 XML 库。我喜欢它并将它用于我的所有项目。如果您通读本教程,那么我认为您会发现它能够以更少的代码更快地完成您想要的所有事情。(因此不太容易出错)库在内部使用您要求执行繁重工作的那些解析器。

如果需要,您可以阅读我的博客文章,将其包含在 Android 项目中。(它适用于至少 1.5 以上的所有 Android 版本,这意味着基本上适用于所有人)

于 2011-04-28T00:52:52.567 回答
11

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

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

据我所知,如果您只考虑小文件的速度,请使用 XML 拉解析器,如果文件很大并且您想全部解析,则使用 SAX。

于 2011-07-14T13:09:24.250 回答
3

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

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

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

于 2011-04-27T17:43:11.660 回答
2

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

于 2011-04-27T17:40:22.797 回答
2

Pull 和 Sax 的相似之处在于它们都是低级流方法,比 DOM 更快、内存效率更高,但 pull 比 SAX 有一些优势:

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

使用拉解析器代码,您可以跳过不想解析的整个块,因此它也比总是提取所有节点的主要信息的 SAX 更有效。使用拉式解析器,您还可以在获取所需信息时随时停止解析,而这在 SAX 中是不可能的。

此外,您可以使用拉式解析器来实现 SAX 解析器。反过来是不可能的。

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

于 2014-05-03T13:15:05.983 回答
0

我在使用 SAX 而不是 XMLPullParser 时发现了更好、更高效的输出......我的场景是解析 XML 标签下的属性,我可以轻松完成并将其顺利插入数据库......我认为这取决于情况,当我需要写一个我更喜欢 DOM Parser 的 XML 文件...

public void startElement(String uri, String localName, String qName,
            Attributes attributes) throws SAXException {
        currentElement = true;
        db = new DatabaseHelper(thecontext);
        if (qName.equals("Asa.Amms.Data.Entity.User")) {
            int length = attributes.getLength();
            for (int i = 0; i < length; i++) {
                String name = attributes.getQName(i);
                if (name.equals("Id")) {
                    id = Integer.parseInt(attributes.getValue(i));
                }
                if (name.equals("Login")) {
                    LoginID = attributes.getValue(i).toString();
                }
                if (name.equals("Name")) {
                    Name = attributes.getValue(i).toString();
                }
                if (name.equals("Password")) {
                    Password = attributes.getValue(i).toString();
                }
                if (name.equals("ProgramOfficerId")) {
                    user_ProgramOfficerId = Integer.parseInt(attributes.getValue(i).toString());
                }
            }
            Log.i("Baal dhukbe", id + LoginID + Name + Password);

            db.insertUser(id, LoginID, Name, Password, user_ProgramOfficerId);
        }
}
于 2015-06-14T05:49:09.593 回答
-2

我建议使用 XmlPullParser 之一.. Sax 解析器在我的测试中没有从提要中检索标签.. xmlpullparser 很容易做到 =) 也取决于您的偏好

于 2011-05-04T20:18:09.290 回答