首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >以类似于SAX的方式从磁盘中对XML进行二进制搜索?有可能吗?

以类似于SAX的方式从磁盘中对XML进行二进制搜索?有可能吗?
EN

Stack Overflow用户
提问于 2011-09-16 06:43:58
回答 1查看 238关注 0票数 1

我发现自己需要在一个(可能的)大型XML文件中搜索具有特定时间戳的项目,其速度在动画帧内类型。

我在最近的一个项目中做了一些类似的事情,但是那里的XML足够小,可以放在内存中,所以我将其解析成一个简单对象的数组,并对其进行二进制搜索。轰隆隆!超级快速搜索每帧800多个带时间戳的项目。

这一次,XML文件很可能足够大,以至于将它们解析到内存中是一个愚蠢的想法(这是iOS的东西,所以内存是有限的)。我脑海中的解决方案是从一个文件中进行类似于SAX的流解析,但是使用一个可设置的指针。因此,我可以在另一个二进制搜索中跳过文件指针,解析文件中的下一个完整节点,并使用它来通知搜索指针下一步跳到哪里。

我认为这是一个很好的理论。但是,环顾互联网,我还没有找到允许在文件中设置其当前行号的SAX解析器。许多都将只读访问设置为状态,但都不允许非常关键的位置设置。

所以。有没有人知道XML解析库有这样的能力?再说一次,这是iOS的世界,所以任何基于C/C++的东西都可以,但如果它有一个Obj-C包装器,就会有额外的好处。

EN

回答 1

Stack Overflow用户

发布于 2011-09-16 07:03:11

在XML中不能安全地做到这一点,至少不能直接做到。您说要跳转到某个行号,但这可能对您没有帮助,因为XML不是基于行的。而且您不能轻易地跳到某个节点的第n个子节点,因为这需要完全解析XML。

您可以做的是首先解析整个文件并创建一个索引:对于(需要跳转到的)每个节点,记住它在文件中的起始位置(可能是作为字节偏移量)。您可以使用SAX (或类似于SAX的)解析器来实现这一点,您不需要将整个文档放在内存中。

如果您这样做,您必须解析整个文件一次(O(n)操作),但您可以跳过任何节点并快速解析(在O(1)中),这应该会使二进制搜索性能更好。

或者,您可以基于要搜索的属性创建索引。如果您这样做,整个二进制搜索将在内存中,您可以只解析一个(或几个)您需要的节点,这应该会更快。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7438298

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档