2008-11-19 10 views
10

Je dois prendre un fichier xml existant, et ne modifier que quelques attributs et réécrire le fichier. Je pensais à utiliser libxml2 pour y parvenir. Je pensais à utiliser libxml2. L'application est C/C++ fonctionnant sous Linux. Il est vrai que libxml2 semble inclure plusieurs variantes de l'évier de cuisine, ainsi que des toilettes portatives, des douches et divers autres éléments reliés par la même tuyauterie. Il y a différents analyseurs disponibles et différentes façons de faire les choses. Pour quelqu'un qui n'a pas encore utilisé libxml2, c'est un peu intimidant.comment utiliser libxml2 pour modifier un fichier xml existant?

Quel exemple dois-je regarder, de sorte qu'à la fin, ma sortie .xml est identique au fichier d'entrée d'origine, plus les modifications que j'ai faites? Jusqu'à présent, je jouais avec les exemples de tree1.c, tree2.c, et reader1.c de libxml2, mais avec juste ceux-ci, le xml de sortie ne serait plus jamais le même.

+2

Outre une grande réponse de Brian Bondy , J'ai depuis écrit un petit article sur "Comment démarrer" avec libxml2: http://charette.no-ip.com:81/programming/2010-01-03_LibXml2/ –

Répondre

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

Les principales choses que vous voulez sont probablement ces fonctions:

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

Et voici un exemple rapide d'utiliser XPath pour sélectionner les choses:

//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

J'aurais aimé le voir plus tôt ! – Yos

+0

Pourquoi utilisez-vous 'Type Var (Value)' au lieu de 'Type Var = Value'? –

Questions connexes