我需要一个现有的XML文件,并修改只是几个属性,并写出文件。
我正在考虑使用libxml2来完成。 应用程序是在Linux上运行的C / C ++。
事情是,libxml2似乎包括厨房水槽的几个变化,随着便携式洗手间,淋浴和各种其他东西通过相同的pipe道连接。 有不同的parsing器可用,以及不同的方式做事。 对于以前没有使用libxml2的人来说,这有点吓人。
我应该看什么样的例子,最后,我的输出.xml与原始input文件是否相同,以及我所做的更改? 到目前为止,我一直在玩libxml2的tree1.c,tree2.c和reader1.c示例,但只有这些输出xml不会在任何地方接近相同。
#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("/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);