我发现自己需要以动画帧内类型的速度在(可能)大型 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/