我有一个巨大的(100k +行,5MB +)XML,它充当我的C ++应用程序的数据库。 XML的结构非常简单,例如,它有大量的:
<foo>
<bar prop="true"/>
<baz>blah</baz>
</foo>
标签的嵌套是多层次的,并且有许多具有多个属性的项目。查找和替换此类文件的块的好方法是什么?例如,假设上面的部分重复了几十次,并且在每个块中,标记<baz>
的值是不同的。我想编辑如下:
<baz>
中包含的所有值设置为给定值。到目前为止,我已经了解了以下实现此目的的方法:
查找/替换:这是一个简单易懂的解决方案,也是我上一次的回归。这种方法,恕我直言是最耗时,容易出错和痛苦的方法。绝对不得已。
RegExes :使用正则表达式匹配感兴趣的块并使用替换表达式对其进行编辑。有点像这篇博文:http://blogs.msdn.com/b/vseditor/archive/2004/08/12/213770.aspx。但我觉得这很容易出错,如果正则表达式第一次不完全正确,可能会有很多错过的项目。
Parser&amp;保存:启动一个快速程序,使用Xerces或XML DOM接口(或其他一些XML库)解析XML,读入XML,根据需要对其进行操作并保存回磁盘。同样,这种方法是一个缓慢的过程,但一旦启动并运行,很容易进行修改,并且比RegExes更灵活。
有没有更好的方法来解决这个问题? (编辑:感谢所有重做它使用数据库建议,我知道它是一个巨大的混乱,但通过“更好的方法来处理这个”我的意思是“查找/替换”部分。)
答案 0 :(得分:2)
如果您不想将整个文档放在内存中,我会使用SAX解析器读取它。在阅读时,将已转换的文档附加到第二个(或临时)文件。我认为它可能非常快,并且只占用很少的内存。
答案 1 :(得分:1)
有没有更好的方法来解决这个问题?
如果必须使用XML,则可以使用XML数据库,例如BDB XML(具有C ++ API)。它支持XQuery,事务等。
其他选项包括我过去成功使用的TinyXML。快速且易于使用,不一定是那个大小的文件上最快的,但它将完成工作。
答案 2 :(得分:0)
你的实际内存限制是什么?根据当前的RAM标准,5MB很大但不是很大。
如果可以,我会将DOM与XPath一起使用,它将比SAX或其他基于流的解析少得多的开发工作。我对SAX的问题在于,如果你真的将它用作内存数据库,这意味着按需随机访问,而SAX不适合这种情况 - 你必须反复解析和重新编译,而一旦你有DOM,至少你可以随心所欲地玩它。
回应关于存储内存数据库信息的评论。许多替代方案比XML更适合这种方式。也许您可以使用DOM / XPath实现战术解决方案,并将rip-and-replace视为一个长期项目。