2008-11-19 77 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