jak używać libxml2 do modyfikowania istniejącego pliku xml?

Muszę pobrać istniejący plik xml, zmodyfikować tylko kilka atrybutów i zapisać plik z powrotem.

Myślałem o użyciu libxml2, aby to zrobić. Aplikacja jest C / C++ działa na Linuksie.

Rzecz w tym, że libxml2 wydaje się zawierać kilka odmian zlewozmywaka, wraz z przenośnymi umywalkami, prysznicami i różnymi innymi rzeczami połączonymi tą samą instalacją. Dostępne są różne parsery i różne sposoby robienia rzeczy. Dla kogoś, kto nie używał wcześniej libxml2 jest to trochę onieśmielające.

Na jaki przykład powinienem patrzeć, aby w końcu mój wynik .xml jest identyczny z oryginalnym plikiem wejściowym, plus wprowadzone przeze mnie zmiany? Do tej pory grałem z tree1 libxml2.C, tree2.c i czytelnik1.przykłady c, ale tylko z nich wyjście xml nie będzie w pobliżu tego samego.

Author: Brian R. Bondy, 2008-11-20

1 answers

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

Główne rzeczy, które chcesz, to prawdopodobnie te funkcje:

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

A oto szybki przykład użycia xpath do wybierania rzeczy:

//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);
 21
Author: Brian R. Bondy,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-11-20 00:09:55