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起,这意味着每个人基本上)
我发现SAX模型在一个特定的情况下更容易处理:您将在哪里构建您自己的具有自定义数据结构的整个文档(或至少其主要部分)的内存中表示。 (如果你对数据结构没有特别的了解,那么DOM解析器已经这样做了。)
这两个解析器基本上都是相同的内存/时间明智的。 唯一的事情就是用pull语法分析器,你可以抽出像startelement和endelement这样的事件,只听你想要的。
与android sax解析器一样,您别无选择,只需将代码放在您想要的位置,但必须包含所有事件。
here是一个链接,你可以参考进一步阅读。
我建议使用XmlPullParser之一..萨克斯解析器没有从我的测试中的饲料检索标记.. xmlpullparser这样做很容易=) 也取决于你的喜好也
它完全取决于情况,例如如果xml文件是真的大于你不能选择DOM解析器,因为他们将首先将文件进入内存,然后它将被解析,我发现解析一个大小为n的文件需要7n内存空间。在这种情况下,您应该选择SAX语法分析器来减轻内存消耗。
第二种情况是当文件不是很大时,在这种情况下,您可以使用XML pull parser,因为在这里您可以完全控制xml,您可以跳过解析周期,在SAX中不可能的地方。所以,如果你正在寻找的标签是文件中的第一个,那么你为什么要去整个文件。
所以据我所知,如果只考虑小文件的速度,请使用XML pull解析器,如果文件很大,并且想要解析所有文件,请使用SAX。
拉和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);
}
}
感谢Robert!我读过它,也非常喜欢它。在我玩了一些之后,我会保存我对它的评论 – 2011-04-28 15:59:50
@Robert WTF Robert :-)你的网站似乎没有了! – dbm 2012-01-13 08:46:59
@dbm:对此我很抱歉。我不得不将我的博客从一个域名转移到另一个域名,而且这个地方还存在着错误的链接,这就是其中之一。我编辑了这篇文章,并将其链接到博客移动到的位置。 Thankyou提醒我,我希望人们现在享受新的职位。 (我很失望,因为它应该仍然在旧主机上投掷301重定向)。 – 2012-01-13 12:02:02