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