2012-02-23 86 views
-1

看到documentation of XmlDocument::parse(Ch*) in RapidXml,我还想知道字符缓冲区是'非常量'。我不确定当缓冲区需要通过解析器的任何这种修改而增长时,通常如何工作。图书馆会不会增长?如果我要求它解析,它应该只是解析权利?否则它应该被称为ParseAndPossibleModifyButLetMeKnowIfYouHadToRegrowTheBufferInWhichCaseHeyCheckThisFlagAndCopyThisPointer或类似的东西。RapidXML API可以增加缓冲区吗?

我错过了什么?我想了解这个库,因为我想要的东西很容易用C++打开和附加/编辑xml文件,但是如果有更简单/更好的替代品请不要犹豫,提出这样的建议作为答案!

+0

至于替代方案,[我们有一个问题](http://stackoverflow.com/questions/9387610/what-xml-parser-should-i-use-in-c)。 – 2012-02-23 04:49:50

回答

1

RapidXML尽最大努力成为就地解析器。当它不能时,它将分配内存(链接到xml_document<>的生存期),但仅在必要时分配。由于XML读取,字符串必须实际增长的情况非常罕见。

它会修改字符串的内容(除非您设置非修改标志),并且其对象将保持对该字符串的引用。所以你需要确保缓冲区能够存活足够长的时间。但除此之外,没有什么可担心的。

+0

只有在必要时它意味着什么?一个缓冲区增长可能实际上分配给一个新地址,所以旧的指针可能失效; rapidXml在发生这种情况时如何给我指向新缓冲区的指针? – lurscher 2012-02-23 17:38:51

+0

@lurscher:缓冲区*不能*增长。但是,在某些情况下,RapidXML的字符串转换可能希望使字符串大于其位置。因此,它会在内部分配* new *内存来存储该字符串,因为该字符串不能再进行修改。新的内存与'xml_document <>'关联。 – 2012-02-23 18:02:56

+0

哦!好的,所以如果在文档末尾附加一些xml节点,例如xml_document :: print()可能会返回一个新的缓冲区?有没有办法让它直接打印到文件? – lurscher 2012-02-23 18:06:11

1

Rapidxml永远不需要增长缓冲区。幸运的是,UTF8编码的XML总是在字符串周围有足够的空间来插入终止的空字符并扩展内置的字符实体。

所以唯一修改的是缓冲区的内容,而不是它的大小。

相关问题