2008-11-19 18 views
10

Necesito tomar un archivo xml existente, modificar solo algunos atributos y volver a escribir el archivo.cómo usar libxml2 para modificar un archivo xml existente?

Estaba pensando en usar libxml2 para hacer esto. La aplicación es C/C++ ejecutándose en Linux.

La cosa es que, libxml2 parece incluir varias variaciones del fregadero de la cocina, junto con baños portátiles, duchas y varias otras cosas conectadas a través de la misma plomería. Hay diferentes analizadores disponibles y diferentes formas de hacer las cosas. Para alguien que no ha usado libxml2 antes, esto es un poco intimidante.

¿Qué ejemplo debería estar mirando, para que al final, mi salida .xml sea idéntica al archivo de entrada original, más los cambios que he realizado? Hasta ahora, he estado jugando con los ejemplos tree1.c, tree2.c y reader1.c de libxml2, pero con solo estos, el xml de salida no estará en ninguna parte cerca de la misma.

+2

Además de una gran respuesta de Brian Bondy , Desde entonces he escrito un pequeño artículo sobre "Cómo empezar" con libxml2: http://charette.no-ip.com:81/programming/2010-01-03_LibXml2/ –

Respuesta

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

Las principales cosas que quiere son probablemente estas funciones:

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

y aquí está un ejemplo rápido de utilizar XPath para seleccionar cosas:

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

Ojalá hubiera visto esto antes ! – Yos

+0

¿Por qué está utilizando 'Tipo Var (Valor)' en lugar de 'Tipo Var = Valor'? –

Cuestiones relacionadas