使用libxml2解析包含无效字符的XML属性

时间:2015-01-28 23:21:10

标签: c++ c libxml2

我正在尝试从包含非法字符的第三方界面解析XML响应消息。请注意,这些回复不在我的控制之内。

以下是修改后的示例响应

<?xml version="1.0"?>
<response>
  <data value="Example A" />
  <data value="Example B" />
  <data value="Example C" />
</response>

有时,“value”属性可能包含 ESC 控制字符[0x1b],使用(可疑)来指示要应用于值的特殊特征。

<?xml version="1.0"?>
<response>
  <data value="[0x1b]Example A" />
  <data value="Example B" />
</response>

我正在使用libxml2 xmlParseMemory()函数来尝试解析此响应。 http://www.xmlsoft.org/html/libxml-parser.html#xmlParseMemory

我正在调用函数如下:

xmlDocPtr doc = xmlParseMemory( buffer, size );

当响应XML有效时,我得到一个有效的xmlDocPtr并可以继续使用它。如果响应中包含非法字符,我会收到NULL并在死胡同结束。

有没有办法解析这些邮件而不会收到错误并且不丢弃非法字符?

1 个答案:

答案 0 :(得分:1)

你问无法回答的问题。假设您有一个0x1B而不是\n字符?或者更糟糕的是"?还是\?产生无效xml的任何东西都会使libxml2阻塞,因为它是一个xml解析器。你生成的例子是无效的xml。如果您希望它解析无效的xml,您需要确定它应该如何解析并修改libxml2或修改xml以使其有效并稍后撤消损坏。它是无效的xml的原因恰恰是因为这些事情应该解析的方式并不明显。

最好的解决方案是修复产生(声称的)xml的任何内容,以免产生破碎的xml。