xml - 以类似 SAX 的方式从磁盘二进制搜索 XML - 明智吗?可能的?

标签 xml ios xml-parsing sax binary-search

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

我在最近的一个项目中一直在做类似的事情,但是 XML 足够小,可以放入内存,所以我将它解析为一个简单对象数组,然后对它进行二进制搜索。繁荣!每帧 800 多个带时间戳的项目的超快速搜索。

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

我认为这是一个很好的理论。然而,环顾互联网,我一直无法找到允许在文件中设置其当前行号的 SAX 解析器。许多为您提供只读访问权限作为状态,但没有一个允许这种非常重要的位置设置。

所以。有谁知 Prop 有这种能力的 XML 解析库?同样,这是 iOS 世界,所以任何基于 C/C++ 的东西都可以,但如果它有一个 Obj-C 包装器就可以加分。

最佳答案

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

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

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

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

关于xml - 以类似 SAX 的方式从磁盘二进制搜索 XML - 明智吗?可能的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7438298/

相关文章:

python - 如何转义实际上名为 <parent> 的 BeautifulSoup ISO 标签中的父属性?

xml - 使用 XElement 时如何包含换行符?

java - 在 Android 上的两个 Activity 之间切换时出现 NullPointerException

android - 样式选择器可能吗?

xml - XSL : Avoid exporting namespace definitions to resulting XML documents

ios - 在 iOS 上使用 swift 将出生日期转换为带有本地化年份标签的年龄

IOS 8 - 导航栏按钮问题

ios - UIView 没有名为“delegate”的成员

go - 解析 plist xml

ISO-8859-9 的 java xml 解析