RapidXML是一个快速、轻量级的 C++ XML DOM 解析器,但它有一些怪癖。
在我看来,其中最糟糕的是:
3.2 字符串的所有权。
RapidXml 生成的节点和属性不
拥有它们的名称和值字符串。他们
只需持有指向它们的指针即可。这
意味着你必须小心
手动设置这些值,通过
使用xml_base::name(const Ch *)
or
xml_base::value(const Ch *)
功能。
必须注意确保
传递的字符串的生命周期是
至少与寿命一样长
节点/属性。最简单的方法
实现它是分配字符串
来自拥有的内存池
文档。使用memory_pool::allocate_string()
用于此目的的功能。
现在,我明白这样做是为了速度,但这感觉就像一场车祸即将发生。以下代码看起来无害,但当 foo 返回时,“名称”和“值”超出范围,因此该文档未定义。
void foo()
{
char name[]="Name";
char value[]="Value";
doc.append_node(doc.allocate_node(node_element, name, value));
}
使用建议allocate_string()
按照手动操作,但很容易忘记。
有没有人“增强”RapidXML 来避免这个问题?
我不使用RapidXML,但也许我的方法可以解决您的问题。
我开始使用 Xerces,但除了其他一些小烦恼之外,我发现它很重,所以我转向了 CPPDOM。当我采取行动时,我决定创建一组包装类,这样我的代码就不会依赖于特定的 XML“引擎”,并且如果需要,我可以移植到另一个引擎。
我创建了自己的类来表示基本 DOM 实体(节点、文档等)。这些类在内部使用 pimpl 习惯用法来使用 CPPDOM 对象。
由于我的节点对象包含“真实”节点对象(来自 CPPDOM),我可以根据需要管理任何内容,因此字符串的正确分配和取消分配不会成为问题。
由于我的代码是针对 CPPDOM 的,所以我认为它对您来说没有多大用处,但如果您愿意,我可以将其发布。
顺便说一句,如果您已经有太多使用 RapidXML 的代码,您可以在包装类中重现其接口。我没有这样做,因为使用 Xerces 的代码没有那么长,无论如何我都必须重写它。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)