【问题标题】:Using libxml2 to Parse XML Attributes Containing Invalid Characters使用 libxml2 解析包含无效字符的 XML 属性
【发布时间】:2015-01-28 23:21:09
【问题描述】:

我正在尝试解析来自第三方接口的包含非法字符的 XML 响应消息。请注意,这些回复不在我的控制范围内。

以下是修改后的示例响应

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

有时,“值”属性可能包含 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 并最终陷入死胡同。

有什么方法可以解析这些消息而不会收到错误并且不会丢弃非法字符?

【问题讨论】:

  • 鉴于您正在处理固定响应,难道您不能在 XML 解析之前预处理原始消息文本,并用您自己的特殊文本模式替换 ESC 字符吗?
  • Peter M - 这是我的临时解决方法。该值是任意文本,因此我不会认为这种方法 100% 可靠。
  • 我不确定,但 ESC 字符可能不是有效的 XML UTF-8 字符,因此预处理可能是您唯一真正的选择。

标签: c++ c libxml2


【解决方案1】:

你在问无法回答的问题。假设你得到的是\n 而不是0x1B 字符?或者更糟糕的是额外的"?还是\?任何产生无效 xml 的东西都会让 libxml2 窒息,因为它是一个 xml 解析器。您制作的示例是无效的 xml。如果您希望它解析无效的 xml,您需要确定它应该如何解析并修改 libxml2 或修改 xml,使其有效并稍后撤消损坏。 xml无效的原因正是因为这些东西应该如何解析并不明显。

最好的解决方案是修复任何产生(所谓的)xml 的东西,以免产生损坏的 xml。

【讨论】:

    猜你喜欢
    • 2021-06-03
    • 2015-02-20
    • 2010-11-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-16
    • 1970-01-01
    相关资源
    最近更新 更多