Как использовать libxml2 для изменения существующего файла XML? - PullRequest
10 голосов
/ 20 ноября 2008

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

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

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

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

1 Ответ

21 голосов
/ 20 ноября 2008
#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);
...