libxml2:使用xmlNodeDump()转储节点时缺少子节点

时间:2014-01-07 16:24:00

标签: c libxml2

我遇到了libxml2(版本2.7.8.13)的问题。 我正在尝试使用xmlTextReaderPtr读取器解析内存中的文档时转储节点。

因此,在解析给定节点时,我使用xmlNodeDump()来获取其全部内容,然后切换到下一个节点。 以下是我的工作方式:

[...]
// get the xmlNodePtr from the text reader
node = xmlTextReaderCurrentNode(reader);

// allocate a buffer to dump into
buf = xmlBufferCreate();

// dump the node
xmlNodeDump(buf, node->doc, node, 0 /* level of indentation */, 0 /* disable formatting */);

result = strdup((char*)xmlBufferContent(buf));

这在大多数情况下都有效,但有时结果会丢失解析节点中的一些子节点。例如,整个内存中的xml文档包含

[...]
<aList>
  <a>
    <b>42</b>
    <c>aaa</c>
    <d/>
  </a>
  <a>
    <b>43</b>
...
</aList>

我得到类似的东西:

<aList>
  <a>
    <b>42</b>
    </c>
  </a>
</aList>

结果很好,但缺少一些数据!一大堆孩子“消失了”。 xmlNodeDump()应以递归方式转储。

的所有子级

看起来像某种尺寸限制。 我想我做错了什么,但我无法弄清楚是什么。

感谢您的回答。

1 个答案:

答案 0 :(得分:1)

我成功地以另一种方式正确实现了这一点,但我仍然不明白那里发生了什么。感谢您阅读我的问题。

仅供参考,我没有尝试修改基于xmlTextReader的现有解析代码,而是根据我的情况重写了一个小的解析模块(将所有第一级兄弟转储到单独的内存块中)。 我是通过使用libxml2的解析和树模块来实现的,所以:

  1. 使用xmlReadMemory()
  2. 从内存中的xml文档中获取树
  3. 使用xmlDocGetRootElement()
  4. 获取第一个节点
  5. 对于每个兄弟(使用xmlNextElementSibling()),使用xmlNodeDump()
  6. 转储其内容(递归所有子项)

    Etvoilà,实际上有点直截了当。有时从头开始更容易......

    我猜有一些副作用。