RapidXML是一个快速,轻量级的C ++ XML DOM Parser,但它有一些怪癖。
我想到的最糟糕的是:
3.2字符串所有权。
RapidXml生成的节点和属性没有 拥有他们的名字和价值字符串。他们 只是抓住他们的指针。这个 意味着你必须要小心 通过手动设置这些值 使用
xml_base::name(const Ch *)
或xml_base::value(const Ch *)
函数。必须注意确保这一点 传递的字符串的生命周期是 至少只要有一生的寿命 节点/属性。最简单的方法 实现它是分配字符串 来自memory_pool所拥有的 文献。使用
memory_pool::allocate_string()
为此目的的功能。
现在,我知道它是以这种速度完成的,但这感觉就像车祸等待发生。以下代码看起来无害,但当foo返回时,'name'和'value'超出范围,因此doc是未定义的。
void foo()
{
char name[]="Name";
char value[]="Value";
doc.append_node(doc.allocate_node(node_element, name, value));
}
根据手册使用allocate_string()
的建议,但它很容易忘记。
有没有人'增强'RapidXML来避免这个问题?
答案 0 :(得分:1)
我不使用RapidXML,但也许我的方法可以解决您的问题。
我开始使用Xerces,但我发现它很重,除了其他轻微的烦恼,所以我搬到了CPPDOM。当我做出移动时,我决定创建一组包装类,以便我的代码不依赖于特定的XML'引擎',如果需要,我可以移植到另一个。
我创建了自己的类来表示基本的DOM实体(节点,文档等)。这些类在内部使用pimpl习语来使用CPPDOM对象。 由于我的节点对象包含'真实'节点对象(来自CPPDOM),我可以根据需要管理任何内容,因此正确分配和释放字符串不会成为问题。
由于我的代码是针对CPPDOM的,我认为它不会对你有用,但如果你愿意,我可以发布它。
顺便说一句,如果你已经有太多已经使用RapidXML的代码,你可以在你的包装类中重现它的接口。我没有这样做,因为使用Xerces的代码不是很长,我还是要重写它。