SAX 解析器与 XMLPull 解析器
Posted
技术标签:
【中文标题】SAX 解析器与 XMLPull 解析器【英文标题】:SAX parser vs XMLPull parser 【发布时间】:2011-08-14 01:35:43 【问题描述】:我了解 的工作方式之间的区别。 其实这里有一个很好的解释:
http://www.firstobject.com/xml-reader-sax-vs-xml-pull-parser.htm 这篇文章有点以 .NET 为中心,但概念适用。
虽然我同意作者的观点,即 Pull 解析器更易于使用,但对于哪种类型的解析器在哪种情况下会更好,我感到很困惑。 如果有人能阐明并指出我的更多阅读内容,我将不胜感激。
谢谢。
【问题讨论】:
【参考方案1】:我发现他们都很烂。 (而且我有更好的解决方案建议)
您应该使用Simple annotation based XML library。我喜欢它并将它用于我的所有项目。如果你read through the tutorial,那么我想你会发现它可以做你想做的一切,而且速度更快,代码更少。 (因此不太容易出现错误)库在内部使用您要求执行繁重工作的那些解析器。
如果需要,您可以阅读我的blog post on including it in an android project。 (它适用于至少 1.5 以上的所有 Android 版本,这意味着基本上适用于所有人)
【讨论】:
谢谢罗伯特!我通读了它,也非常喜欢它。再玩一会儿我会把我的cmets保存在上面 @Robert WTF Robert :-) 您的网站似乎已关闭! @dbm:对此我感到非常抱歉。我不得不将我的博客从一个域移动到另一个域,并且这个地方仍然存在错误的链接,这就是其中之一。我已经编辑了这篇文章并放入了博客移动到的链接。谢谢你提醒我,我希望人们现在喜欢这些新帖子。 (我很失望,因为它应该仍然向旧主机抛出 301 重定向)。 SimpleXML 不适合 large XMLs。为此,请使用 SAX。 这是 android,所以你受到内存和 CPU 的限制。所以这些都是真正的问题:它是否会破坏整个 xml?代码效率高吗?【参考方案2】:这完全取决于情况,例如,如果 xml 文件真的比你不能选择 DOM 解析器大,因为它们会首先将文件放入内存,然后它会被解析,我发现解析文件大小为 n 需要 7n 个内存空间。在这种情况下,您应该选择轻量级的 SAX 解析器,并且会消耗更少的内存。
第二种情况是当文件不是很大时,在这种情况下,您可以使用 XML 拉解析器,因为在这种情况下,您将完全控制 xml,您可以跳过任何在 SAX 中不可能的解析周期。因此,如果您要查找的标签是文件中的第一个标签,那么您为什么要查找整个文件。
据我所知,如果您只考虑小文件的速度,请使用 XML 拉解析器,如果文件很大并且您想要全部解析,则使用 SAX。
【讨论】:
好吧,昨天它在起作用,也许是服务器端的事情 抱歉,伙计们回复晚了,但是这个链接已经坏了。我会尽快回复您并提供更好的答案。 链接已损坏,所以我写下了我的理解,如果缺少某些内容,请更新【参考方案3】:两个解析器在内存/时间方面基本相同。 唯一的一点是,使用拉解析器,您可以提取 startelement 和 endelement 之类的事件,并且只关注您想要的事件。
与 android sax 解析器一样,您别无选择,您只需将代码放在您想要的位置,但您必须包含所有事件。
here 是一个链接,您可以参考以进一步阅读。
【讨论】:
【参考方案4】:我发现 SAX 模型在一种特定情况下更易于使用:您将使用自定义数据结构构建自己的整个文档(或至少其主要部分)的内存表示。 (如果您对数据结构不特别关注,那么 DOM 解析器已经这样做了。)
【讨论】:
【参考方案5】:Pull 和 Sax 的相似之处在于它们都是比 DOM 更快且内存效率更高的低级流式处理方法,但 pull 与 SAX 相比有一些优势:
Pull 比 SAX 更容易实现,因为您不必维护解析器的状态(使用附加变量能够知道您的解析器当前在 XML 树中的哪个位置)。拉解析器代码中的嵌套循环或多或少与文档的 XML 层次结构相匹配,因此我认为拉解析器代码也比 SAX 解析器代码更具可读性。
使用拉解析器代码,您可以跳过不想解析的整个块,因此它也比总是提取所有节点的主要信息的 SAX 更有效。使用拉式解析器,您还可以在获取所需信息时随时停止解析,而这在 SAX 中是不可能的。
此外,您可以使用拉式解析器来实现 SAX 解析器。反之亦然。
出于所有这些原因,我相信拉式解析器在所有情况下都优于 SAX,但与 SAX 一样,正确实施并非易事,您必须小心。如果您不需要 pull 和 SAX 的低级速度优势,并且您的 XML 是干净的,您可以随时使用像 Simple 这样的高级解析库来为您完成艰苦的工作。
【讨论】:
【参考方案6】:我在使用 SAX 而不是 XMLPullParser 时发现更好、更有效的输出...我的场景是解析 XML 标记下的属性,我可以轻松完成并将其顺利插入数据库...我认为这取决于情况下,当我需要编写 XML 文件时,我更喜欢 DOM Parser...
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);
【讨论】:
【参考方案7】:我建议使用 XmlPullParser 一个.. Sax 解析器在我的测试中没有从提要中检索标签.. xmlpullparser 很容易做到 =) 也取决于你的喜好也
【讨论】:
以上是关于SAX 解析器与 XMLPull 解析器的主要内容,如果未能解决你的问题,请参考以下文章