2008-11-19 7 views
10

Ich muss eine vorhandene XML-Datei nehmen und nur ein paar Attribute ändern und die Datei zurückschreiben.Wie benutze ich libxml2 um eine existierende XML Datei zu modifizieren?

Ich dachte über die Verwendung von libxml2, um dies zu tun. Anwendung ist C/C++, das unter Linux läuft.

Die Sache ist, libxml2 scheint mehrere Variationen der Küchenspüle, zusammen mit tragbaren Waschräumen, Duschen und verschiedenen anderen Dingen, die über die gleichen Rohrleitungen verbunden sind. Es gibt verschiedene Parser und verschiedene Arten, Dinge zu tun. Für jemanden, der libxml2 noch nicht benutzt hat, ist dies ein wenig einschüchternd.

Welches Beispiel sollte ich betrachten, damit meine Ausgabe .xml am Ende identisch mit der ursprünglichen Eingabedatei ist, plus die Änderungen, die ich vorgenommen habe? Bis jetzt habe ich mit den Beispielen libxml2 in den Verzeichnissen tree1.c, tree2.c und reader1.c gespielt, aber mit diesen wird die Ausgabe-XML nicht annähernd gleich sein.

+2

Neben Brian Bondy große Antwort Ich habe seitdem einen kleinen Artikel über "How To Get Started" mit libxml2 geschrieben: http://charette.no-ip.com:81/programming/2010-01-03_LibXml2/ –

Antwort

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

Die wichtigsten Dinge, die Sie sind wahrscheinlich diese Funktionen:

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

Und hier ist ein kurzes Beispiel von XPath Dinge wählen:

//Select all the user nodes 
xmlChar *pExpression((xmlChar*)_T("https://stackoverflow.com/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); 
+0

Ich wünschte, ich hätte das früher gesehen ! – Yos

+0

Warum verwenden Sie 'Type Var (Value)' anstelle von 'Type Var = Value'? –

Verwandte Themen