SAX解析器vs XMLPull解析器

问题描述:

我明白SAX解析器如何工作与XMLPull解析器的区别。 实际上这里有一个很好的解释:SAX解析器vs XMLPull解析器

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

虽然我同意作者的观点,Pull解析器更容易处理,但我很困惑哪种类型的解析器在哪种情况下会更好。 如果任何人可以摆脱任何光线,并指出我更多的阅读,我将不胜感激。

谢谢。

我发现他们都吸吮。 (我有更好的解决方案建议)

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

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

+0

感谢Robert!我读过它,也非常喜欢它。在我玩了一些之后,我会保存我对它的评论 – 2011-04-28 15:59:50

+0

@Robert WTF Robert :-)你的网站似乎没有了! – dbm 2012-01-13 08:46:59

+1

@dbm:对此我很抱歉。我不得不将我的博客从一个域名转移到另一个域名,而且这个地方还存在着错误的链接,这就是其中之一。我编辑了这篇文章,并将其链接到博客移动到的位置。 Thankyou提醒我,我希望人们现在享受新的职位。 (我很失望,因为它应该仍然在旧主机上投掷301重定向)。 – 2012-01-13 12:02:02

我发现SAX模型在一个特定的情况下更容易处理:您将在哪里构建您自己的具有自定义数据结构的整个文档(或至少其主要部分)的内存中表示。 (如果你对数据结构没有特别的了解,那么DOM解析器已经这样做了。)

这两个解析器基本上都是相同的内存/时间明智的。 唯一的事情就是用pull语法分析器,你可以抽出像startelement和endelement这样的事件,只听你想要的。

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

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

我建议使用XmlPullParser之一..萨克斯解析器没有从我的测试中的饲料检索标记.. xmlpullparser这样做很容易=) 也取决于你的喜好也

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

第二种情况是当文件不是很大时,在这种情况下,您可以使用XML pull parser,因为在这里您可以完全控制xml,您可以跳过解析周期,在SAX中不可能的地方。所以,如果你正在寻找的标签是文件中的第一个,那么你为什么要去整个文件。

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

+2

链接被破坏... – thepoosh 2012-04-19 07:29:48

+0

没有它的工作我高压检查了它... – 2012-04-20 04:42:28

+0

好吧,昨天它是表演,也许这是一个服务器端的事情 – thepoosh 2012-04-20 14:09:24

拉和SAX是的方式,它们是比DOM更快,更高效存储两个低级别的数据流的方法相似,但拉拥有SAX几个优点:

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

使用拉解析器代码,您可以跳过不想分析的整个块,因此它比总是提取所有节点的主要信息的SAX更有效。使用pull解析器,您也可以在任何时候停止解析,如果您提取了您想要的信息,这对于SAX来说是不可能的。

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

由于所有这些原因,我认为在所有情况下,pull语法分析器都优于SAX,但是与SAX一样,实施正确并不是微不足道的,您必须小心。如果您不需要pull和SAX的低级速度优势并且您的XML是干净的,那么您总是可以使用更高级别的解析库(如Simple)来帮助您完成工作。

我在使用SAX而不是XMLPullParser的时候发现了更好更高效的输出......我的场景是解析XML标签下的属性,我可以轻松地将其插入到数据库中......我认为这取决于在需要写XML文件时,我更喜欢DOM解析器...

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); 
     } 
}