XML编辑/替换的不错选择

问题描述

|| 我有一个巨大的(100k +行,5MB +)XML,它充当C ++应用程序的数据库。 XML的结构非常简单,例如,它具有以下块:
<foo>
<bar prop=\"true\"/>
<baz>blah</baz>
</foo>
标签的嵌套深达数个层次,并且许多项目具有多个属性。查找和替换这种文件块的好方法是什么?例如,假设上述部分重复了几十次,并且在每个块中标签
<baz>
的值都不同。我想进行如下编辑: 将标签“ 1”中包含的所有值设置为给定值。 删除包含某些值的块 等等。 到目前为止,我已经学习了以下方法来实现此目的: 查找/替换:轻而易举的简单解决方案,也是我的最后一个后备。恕我直言,这种方法是最耗时,容易出错且痛苦的方法。绝对不得已。 RegExes:使用正则表达式匹配感兴趣的块并使用替换表达式对其进行编辑。 Kinda喜欢此博客文章:http://blogs.msdn.com/b/vseditor/archive/2004/08/12/213770.aspx。但是我觉得这很容易出错,并且如果正则表达式第一次不正确的话,可能会丢失很多东西。 解析器和保存:编写一个快速程序,使用Xerces或XML DOM接口(或其他XML库)解析XML,读取XML,根据需要进行操作,然后保存回磁盘。同样,此方法一个缓慢的过程,但是一旦启动并运行,则比RegExes容易进行修改并且更加灵活。 有没有更好的方法解决这个问题? (编辑:感谢所有使用数据库建议的重做,我知道它是一团糟,但是用“更好的方式来解决这个问题”是指“查找/替换”部分。)     

解决方法

如果您不想将整个文档放在内存中,则可以使用SAX解析器读取它。阅读时,将转换后的文档附加到第二个(或临时)文件中。我认为这可能会很快,并且只占用少量内存。     ,  有没有更好的方法来解决这个问题? 如果必须使用XML,则可以使用XML数据库,例如BDB XML(具有C ++ API)。它支持XQuery,事务等。 其他选项包括TinyXML,我过去曾经成功使用过。快速且易于使用,不一定是该大小文件中最快的,但它可以完成工作。     ,您实际的内存限制是什么? 5MB是很大的,但按照当前的RAM标准来说并不是很大。 如果可以的话,我将DOM与XPath一起使用,这将比SAX或其他基于流的解析要少得多的开发工作。我对SAX的问题是,如果您确实将其用作内存数据库,则意味着按需进行随机访问,而SAX则不适合这样做-您将不得不反复分析和重新序列化,而一旦拥有DOM,至少您可以随意使用它。 Echo评论也将存储RAM中的数据库信息。许多替代方法比XML更适合于此。也许您可以使用DOM / XPath来实现战术解决方案,并作为长期项目来研究撕裂与更换。     

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...