Как использовать libxml2 для изменения существующего xml файла?

Мне нужно взять существующий xml файл и изменить только несколько атрибутов и записать файл обратно.

Я думал об использовании libxml2, чтобы сделать это. Приложение C/С++ работает в Linux.

Thing is, libxml2, кажется, включает в себя несколько вариантов кухонной раковины, наряду с портативными туалетными комнатами, душевыми кабинами и другими вещами, связанными через ту же сантехнику. Существуют различные парсеры и разные способы делать вещи. Для тех, кто раньше не использовал libxml2, это немного запугивает.

В каком примере я должен смотреть, так что в конце мой выход .xml идентичен исходному входному файлу плюс изменения, которые я сделал? До сих пор я играл с примерами libxml2 tree1.c, tree2.c и reader1.c, но только с этими выводами xml не был бы где-то рядом с тем же.

Ответ 1

#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);