2014-01-07 87 views
0

我遇到了libxml2(版本2.7.8.13)的問題。 我正試圖轉儲節點,同時用xmlTextReaderPtr閱讀器解析內存中的文檔。libxml2:使用xmlNodeDump轉儲節點時丟失子節點()

因此,在解析給定的節點時,我使用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()應該遞歸地轉儲所有的子項。

它看起來像某種尺寸限制。 我想我做錯了什麼,但我無法弄清楚什麼。

謝謝你的回答。

+0

結果不是完整的,它有一個關閉沒有開放。請提供一段示例代碼和它解析的XML內容,以顯示問題(而不是每個摘要的摘要),並且我們可以確定發生了什麼。 –

+0

謝謝你評論我的問題。 當我說結果是格式良好時,我的意思是任何打開的標籤都是關閉的。我特意寫了,因爲在我的情況下,libxml2在輸入上做了這樣的事情:某些數據被清除,而不是有 blabla我得到。 代碼的精神在那裏,如果你需要一些確切的信息,請問我,但我不明白什麼是相關的。 – user2485337

+0

哎呀我做錯了,它是,對不起,關於那 – user2485337

回答

1

我成功地以另一種方式正確實施,但我不明白那裏發生了什麼。感謝您閱讀我的問題。我只是爲我的情況重寫了一個小的解析模塊(將所有的第一級兄弟轉儲到單獨的內存塊中),而不是試圖修補現有的基於xmlTextReader的解析代碼。 我這樣做是通過使用的libxml2的解析和樹的模塊,因此:

  1. 從內存中XML文檔獲取樹xmlReadMemory()
  2. 獲得與xmlDocGetRootElement()的第一個節點
  3. 對於每個兄弟(使用xmlNextElementSibling()),使用xmlNodeDump()遞送其內容(所有子節點)

等voilà,實際上很簡單。有時候從頭開始更容易...

我想這會有一些副作用。