2008-11-19 66 views
10

我需要一個現有的xml文件,並修改一些屬性並將其寫回。如何使用libxml2修改現有的xml文件?

我正在考慮使用libxml2來完成這件事。應用程序是在Linux上運行的C/C++。

事情是,libxml2似乎包括廚房水槽的幾個變體,以及便攜式洗手間,淋浴和通過相同管道連接的各種其他東西。有不同的解析器可用,以及不同的做事方式。對於之前沒有使用過libxml2的人來說,這有點嚇人。

我應該看什麼樣的示例,以便最終我的輸出.xml與原始輸入文件相同,還有我所做的更改?到目前爲止,我一直在玩libxml2的tree1.c,tree2.c和reader1.c示例,但只有這些輸出xml不會在任何地方接近相同。

+2

除了布萊恩·邦迪的偉大答覆,我已經寫了一篇關於libxml2的「如何開始」的小文章:http://charette.no-ip.com:81/programming/2010-01-03_LibXml2/ – 2010-01-13 00:30:37

回答

21
#include <libxml/xmlmemory.h> 
#include <libxml/parser.h> 
#include <libxml/xpath.h> 

//Load in the xml file from disk 
xmlDocPtr pDoc = xmlParseFile("file.xml"); 
//Or from a string xmlDocPtr pDoc = xmlNewDoc("<root><element/></root>"); 

//Do something with the document 
//.... 

//Save the document back out to disk. 
xmlSaveFileEnc("file.xml", pDoc, "UTF-8"); 

你想要的主要的東西,可能是這些功能:

xmlNodePtr pNode = xmlNewNode(0, (xmlChar*)"newNodeName"); 
xmlNodeSetContent(pNode, (xmlChar*)"content"); 
xmlAddChild(pParentNode, pNode); 
xmlDocSetRootElement(pDoc, pParentNode); 

這裏是使用XPath來選擇的東西的一個簡單的例子:

//Select all the user nodes 
xmlChar *pExpression((xmlChar*)_T("https://stackoverflow.com/users/user")); 
xmlXPathObjectPtr pResultingXPathObject(getnodeset(pDoc, pExpression)); 
if (pResultingXPathObject) 
{ 
    xmlNodeSetPtr pNodeSet(pResultingXPathObject->nodesetval); 
    for(int i = 0; i < pNodeSet->nodeNr; ++i) 
    { 
     xmlNodePtr pUserNode(pNodeSet->nodeTab[i]); 
        //do something with the node 
    } 
} 
xmlXPathFreeObject(pResultingXPathObject); 
+0

我希望我能早點看到! – Yos 2016-04-05 09:51:16