2014-03-03 63 views
1

我在代碼中生成了一些xml(作爲字符串),然後我想將該字符串設置爲現有節點的子元素(使用xmlNodeSetContent)。將字符串注入到沒有內容轉義的XML節點中

的問題是,無論是xmlNodeSetContent功能或我使用的XML省電功能(xmlSaveFormatFileEnc)的逸出「<」和「>」字符爲「& LT;」和'& gt;'

如何在這種情況下切換轉義?或者,我可以格式化字符串以禁用轉義嗎?

可能的答案: 我嘗試過的一種解決方案是在文本字符串周圍添加相關的XML標題和主要元素,然後像裝入第二個XML文檔一樣加載字符串。然後,我可以將新文檔添加到子節點和/或內容中,並將其添加到我的現有節點。這工作,但我希望有一個更簡單的方法。

澄清: 我的程序的一部分是生成XML並只將它作爲字符串返回。我想採用這個字符串並將其注入到現有文檔中。如果我使用xmlNodeSetContent它的工作類型,除了一些XML語法轉義,我不想。

+1

可能重複的[如何添加從libxml2中的字符串構造的xml節點](http://stackoverflow.com/questions/12927548/how-to-add-a-xml-node-constructed-from-string- in-libxml2) – nwellnhof

+0

感謝您的鏈接。我實際上開始使用readFromMemory方法,但是這個鏈接使我得到了一個新的(希望更好的方式) - 編輯我的答案。 –

回答

1

我現在用下面的代碼注入XML文本(可能包含多個元素)到現有節點(感謝納扎爾和nwellnhof了一個答案,我引薦功能到How to add a xml node constructed from string in libxml2):

std::string xml = "<a>" + str + "</a>"; 
xmlNodePtr pNewNode = nullptr; 
xmlParseInNodeContext(pParentNode, xml.c_str(), (int)xml.length(), 0, &pNewNode); 
if (pNewNode != nullptr) 
{ 
    // add new xml node children to parent 
    xmlNode *pChild = pNewNode->children; 
    while (pChild != nullptr) 
    { 
     xmlAddChild(pParentNode, xmlCopyNode(pChild, 1)); 
     pChild = pChild->next; 
    } 

    xmlFreeNode(pNewNode); 
} 

它以串(STR)增加了一個圍繞元件(<一> ... <一個/>),解析使用xmlParseInNodeContext字符串,然後添加新節點的孩子父母。添加新節點的子節點而不是新節點非常重要,以避免在最終的XML中有一個>> ... < a />。

0

libxml2具有創建文檔片段的功能。這在某些語言中暴露爲文檔對象上的createDocumentFragment()方法。

本來應該是xmlNewDocFragment

+0

如何使用它來設置節點的內容(沒有逃生問題)? –

+0

您可以使用它來創建xml片段字符串中的節點列表。您可以附加到DOM的節點。 – ThW

+1

你可以提供一個簡單的僞/ C++的例子嗎?我看了一下API文檔,但我看不到如何指定片段字符串。 –

相關問題