XML

30 views
Skip to first unread message

Matias Petrone

unread,
Sep 15, 2010, 4:50:57 PM9/15/10
to C Talks
Estuve leyendo la siguiente pag http://xmlsoft.org/ en lo que creo que
esta todo .
Tambien vi en foro como agregar los header , librerias , bibliotecas
etc al proyecto en visual.

Mi duda es esta:

Para asignarle el archivo que vamos a parsear se usa esta funcion?

doc = xmlReadFile(filename, NULL, 0);

si es el caso de que esta es la correcta

a que se refiere filename: al handler, al nombre literalmente o a la
direccion en donde se encuentra?

desde ya muchas gracias!

Facundo Viale

unread,
Sep 15, 2010, 6:13:56 PM9/15/10
to c-t...@googlegroups.com
Matias,
        ahí le eche un ojo a la pagina esa, los ejemplos que tiene son re chotos de hecho el primero que vi no compila ni a palos O.o  lo cual es medio decepcionante.

como bien pusiste arriba para leer un archivo haces:

    xmlTextReaderPtr reader = xmlReaderForFile(filename, NULL, 0); 

En cuando al filename, es tal cual lo dice es el path del archivo xml ( c:\\test.xml )

Una aclaración, la pagina de donde estas leyendo es la implementacion de libxml2 de gnome por lo cual están los ejemplos para Linux/Unix. De hecho como te muestra en el ejemplo te dice que invoques al gcc XD

Bueno tal y como aclara la pagina, si usas esta librerias en Linux vas a tener que agregar al GCC los parametros `xml2-config --cflags` `xml2-config --libs` y si estas con el eclipse tenes que agregar esto tanto al linker como al compiler.


Cualquier cosa seguro Mati, va a responder las aclaraciones con respecto a usarlas en Windows.

Saludos!


--
Recibiste este mensaje porque estás suscrito al Grupo "C Talks".
Si quieres publicar en este grupo, envía un mensaje de correo
electrónico a c-t...@googlegroups.com
Para anular la suscripción a este grupo, envía un mensaje a
c-talks+u...@googlegroups.com
Para obtener más opciones, visita este grupo en
http://groups.google.com.ar/group/c-talks?hl=es.

Matías Dumrauf

unread,
Sep 16, 2010, 12:34:36 PM9/16/10
to c-t...@googlegroups.com
Matías,

Como dice Facu, la función recibe como argumento el path del doc XML a leer. Ésto te sirve si vos tenés un doc xml en disco! y lo querés levantar a memoria y leerlo, para recién ahí parsearlo.

Si vos querés leer un doc XML que tenés armado dentro de un string (y enviaste a través de sockets, por ejemplo), las funciones a utilizar son otras.


Para poder utilizar Libxml2 en un Proyecto de Visual Studio 2005:

1) Descomprimir el archivo libxml2-2.7.3.win32.zip, y copiar las carpetas bin, include y lib al directorio raiz del proyecto.

2) Incluir directorio de headers.
Ir a Proyecto->Propiedades->Propiedades de Configuracion->C/C++->General
En la derecha, donde dice "Directorios de inclusión adicionales", hacer click
y escribir el path relativo:

..\include\

3) Incluir directorio de bibiliotecas.
Ir a Proyecto->Propiedades->Propiedades de Configuracion->Linker->General
En la derecha, donde dice "Directorios de bibliotecas adicionales", hacer click
y escribir el path relativo

..\lib\

4) Indicarle al Linker la dependencia de linkeo con la biblioteca. Existen dos formas:
  1. Incluir la directiva pragma correspondiente, de la biblioteca que necesitemos, en el codigo. #pragma comment(lib,"libxml2.lib") // luego los headers int main(void){ ... }
  2. A través de las Configuraciones del Proyecto de Visual Studio 2005:
              2.1. Click derecho en Propiedades del Proyecto
              2.2. Desplegar la sección "Linker"
              2.3. Seleccionar la sub-sección "Input"
              2.4. En la ventana derecha, donde dice "Additional Dependencies",
                     escribir las dependencias que se requieran, con el path -relativo o absoluto- correspondiente. [Imagen: configurarpropiedadesde.jpg]



5) Modificar el Path del Archivo de Resultados a la carpeta "bin" para que cree el ejecutable ahí y encuentre las dll necesarias.

Ir a Proyecto->Propiedades->Propiedades de Configuracion->Vinculador->General
En la derecha, donde dice "Archivo de resultados", hacer click
y escribir el path relativo

..\bin\<Nombre_del_Proyecto>.exe


Cualquier cosa, decinos que te damos una mano.

Saludos,

Matías Dumrauf

Matias Petrone

unread,
Sep 17, 2010, 11:19:31 AM9/17/10
to C Talks
Gracias por la respuesta,

claro mi idea era parsearlo en linux/solaris y levantarlo en windows.

Para levantarlo le mando la direccion en donde esta el xml usando esta
funcion

doc = xmlReadFile(filename, NULL, 0);

pero despues quiero pasarlo a un string para poder mandarlo por socket

hay alguna funcion de la libreria q haga esto?



On 16 sep, 13:34, Matías Dumrauf <matias.dumr...@gmail.com> wrote:
> Matías,
>
> Como dice Facu, la función recibe como argumento *el path del doc XML* a
> leer. Ésto te sirve si vos tenés un doc xml *en disco!* y lo querés levantar
> a memoria y leerlo, para recién ahí parsearlo.
>
> Si vos querés leer un doc XML que tenés armado *dentro de un string* (y
> enviaste a través de sockets, por ejemplo), las funciones a utilizar son
> otras.
>
> *Para poder utilizar Libxml2 en un Proyecto de Visual Studio 2005*:
>
> 1) Descomprimir el archivo libxml2-2.7.3.win32.zip, y copiar las carpetas
> bin, include y lib al directorio raiz del proyecto.
>
> 2) Incluir directorio de headers.
> Ir a Proyecto->Propiedades->Propiedades de Configuracion->C/C++->General
> En la derecha, donde dice "Directorios de inclusión adicionales", hacer
> click
> y escribir el path relativo:
>
> ..\include\
>
> 3) Incluir directorio de bibiliotecas.
> Ir a Proyecto->Propiedades->Propiedades de Configuracion->Linker->General
> En la derecha, donde dice "Directorios de bibliotecas adicionales", hacer
> click
> y escribir el path relativo
>
> ..\lib\
>
> 4) Indicarle al Linker la dependencia de linkeo con la biblioteca. Existen
> dos formas:
>
>    1. Incluir la directiva pragma correspondiente, de la biblioteca que
>    necesitemos, en el codigo. #pragma comment(lib,"libxml2.lib") // luego los
>    headers int main(void){ ... }
>    2. A través de las Configuraciones del Proyecto de Visual Studio 2005:
>
>               2.1. Click derecho en Propiedades del Proyecto
>               2.2. Desplegar la sección "Linker"
>               2.3. Seleccionar la sub-sección "Input"
>               2.4. En la ventana derecha, donde dice "Additional
> Dependencies",
>                      escribir las dependencias que se requieran, con el path
> -relativo o absoluto- correspondiente. [image: [Imagen:
> configurarpropiedadesde.jpg]]
>
> 5) Modificar el Path del Archivo de Resultados a la carpeta "bin" para que
> cree el ejecutable ahí y encuentre las dll necesarias.
>
> Ir a Proyecto->Propiedades->Propiedades de
> Configuracion->Vinculador->General
> En la derecha, donde dice "Archivo de resultados", hacer click
> y escribir el path relativo
>
> ..\bin\<Nombre_del_Proyecto>.exe
>
> Cualquier cosa, decinos que te damos una mano.
>
> Saludos,
>
> Matías Dumrauf
>
> El 15 de septiembre de 2010 19:13, Facundo Viale
> <facundo.m.vi...@gmail.com>escribió:
>
> > Matias,
> >         ahí le eche un ojo a la pagina esa, los ejemplos que tiene son re
> > chotos de hecho el primero que vi no compila ni a palos O.o  lo cual es
> > medio decepcionante.
>
> > como bien pusiste arriba para leer un archivo haces:
>
> >     xmlTextReaderPtr reader = xmlReaderForFile(filename, NULL, 0);
>
> > En cuando al filename, es tal cual lo dice es el path del archivo xml (
> > c:\\test.xml )
>
> > Una aclaración, la pagina de donde estas leyendo es la implementacion de
> > libxml2 de gnome por lo cual están los ejemplos para Linux/Unix. De hecho
> > como te muestra en el ejemplo te dice que invoques al gcc XD
>
> > Bueno tal y como aclara la pagina, si usas esta librerias en Linux vas a
> > tener que agregar al GCC los parametros `xml2-config --cflags` `xml2-config
> > --libs` y si estas con el eclipse tenes que agregar esto tanto al linker
> > como al compiler.
>
> > Cualquier cosa seguro Mati, va a responder las aclaraciones con respecto a
> > usarlas en Windows.
>
> > Saludos!
>
> > El 15 de septiembre de 2010 17:50, Matias Petrone <
> > matias.petr...@gmail.com> escribió:
>
> > Estuve leyendo la siguiente paghttp://xmlsoft.org/en lo que creo que
> >> esta todo .
> >> Tambien vi en foro como agregar los header , librerias , bibliotecas
> >> etc al proyecto en visual.
>
> >> Mi duda es esta:
>
> >> Para asignarle el archivo que vamos a parsear se usa esta funcion?
>
> >> doc = xmlReadFile(filename, NULL, 0);
>
> >> si es el caso de que esta es la correcta
>
> >> a que se refiere filename: al handler, al nombre literalmente o a la
> >> direccion en donde se encuentra?
>
> >> desde ya muchas gracias!
>
> >> --
> >> Recibiste este mensaje porque estás suscrito al Grupo "C Talks".
> >> Si quieres publicar en este grupo, envía un mensaje de correo
> >> electrónico a c-t...@googlegroups.com
> >> Para anular la suscripción a este grupo, envía un mensaje a
> >> c-talks+u...@googlegroups.com<c-talks%2Bunsu...@googlegroups.com>
> >> Para obtener más opciones, visita este grupo en
> >>http://groups.google.com.ar/group/c-talks?hl=es.
>
> >  --
> > Recibiste este mensaje porque estás suscrito al Grupo "C Talks".
> > Si quieres publicar en este grupo, envía un mensaje de correo
> > electrónico a c-t...@googlegroups.com
> > Para anular la suscripción a este grupo, envía un mensaje a
> > c-talks+u...@googlegroups.com<c-talks%2Bunsu...@googlegroups.com>

Matias Petrone

unread,
Sep 17, 2010, 2:36:25 PM9/17/10
to C Talks
Por suerte luchando un poco pude hacerlo

use esta funcion xmlDocDumpFormatMemory

Saludos!
> > > Estuve leyendo la siguiente paghttp://xmlsoft.org/enlo que creo que

Matías Dumrauf

unread,
Sep 18, 2010, 11:35:21 AM9/18/10
to c-t...@googlegroups.com
Buenísimo Matías. Por cuestiones de tiempo no llegué a responderte antes. Te iba a mencionar esa función.


Saludos, y éxitos.

Matías Dumrauf

aaolivar

unread,
Sep 18, 2010, 5:29:03 PM9/18/10
to C Talks


Buenas... una pregunta, saben con que funciones puedo manejar bien los
atributos en XML? Los elementos no me traen problemas pero los
atributos si.
Saludos

Matías Dumrauf

unread,
Sep 18, 2010, 6:08:13 PM9/18/10
to c-t...@googlegroups.com
No se requieren funciones para acceder a los "atributos", mejor llamados: tags. Lo que hay que hacer es recorrer el nodoRoot (del que cuelgan todos los sub-nodos) y por cada hijo consultar por su valor.

Por ejemplo: si tuviéramos un doc XML que tuviera varia un nodo root que es un Grupo de Noticias (Newsgroup) y del cual colgaran varios nodos hijos Noticias (News).

    for (nodo = nodo_root; nodo ; nodo = nodo->next)
    {
        for (nodo_children = nodo->children; nodo_children ; nodo_children = nodo_children->next)
        {
         
            if (nodo_children->type == XML_ELEMENT_NODE) 
            {
                if( utils_string_compare(nodo_children->name, "Newsgroup") == 0 )
                    printf("Newsgroup Name: %s\n", nodo_children->children->content);
 
                if( utils_string_compare(nodo_children->name, "IdNoticia") == 0 )
                   
printf("News Id: %ld\n", atol(nodo_children->children->content);
                     
                if( utils_string_compare(nodo_children->name, "Head") == 0 )
                    printf("News Head: %s\n", nodo_children->children->content);
 
                if( utils_string_compare(nodo_children->name, "Body") == 0 )
                   
printf("News Body: %s\n", nodo_children->children->content);             
 
            }
 
        }
    }



--

aaolivar

unread,
Sep 18, 2010, 6:23:22 PM9/18/10
to C Talks
Yo me referia a algo de este estilo

<persona dni=33333333>
<datos>
<sexo>M</sexo>
<edad>20</edad>
<datos>
<telefonos>
<telefono tel=15655-55555 />
<telefono tel=4465-7890 />
</telefonos>
</persona>

En este caso, el dni y los telefonos no estan puestos en forma de
'atributos'?Tengo entendido que para cambiar o leer la informacion de
(en este caso) la edad y el dni, las funciones son distintas...
Muchas gracias
Saluds
Message has been deleted

aaolivar

unread,
Sep 18, 2010, 8:51:33 PM9/18/10
to C Talks
Encontre algunas funciones para los llamados 'atributos', pero
tambien
me encontre con un problema:
digamos que yo levanto un xml como el que puse antes...
hago nodo_root = xmlDocGetRootElement(doc)
hago un printf a root->name y me da 'persona', 10 puntos,
el tema es este, hago root = root->children y cuando imprimo el name
dice 'text' :S , si imprimo content tira segmentation fault.
si vuelvo a hacer un root = root->children me tira segmentation
fault.
Que tan mal estoy accediendo a las ramas del xml?

Matías Dumrauf

unread,
Sep 18, 2010, 9:20:22 PM9/18/10
to c-t...@googlegroups.com
Agus, investigando un poco, encontré unos buenos ejemplos. Con ésto no creo que tengas problemas.

#include <stdio.h>
#include <libxml/tree.h>

int main(){
xmlDocPtr doc;
xmlNodePtr nodeLevel1;
xmlNodePtr nodeLevel2;

doc = xmlParseFile("xmlfile.xml");
for( nodeLevel1 = doc->children;
nodeLevel1 != NULL;
nodeLevel1 = nodeLevel1->next)
{
printf("%s\n",nodeLevel1->name);
for( nodeLevel2 = nodeLevel1->children;
nodeLevel2 != NULL;
nodeLevel2 = nodeLevel2->next)
{
printf("\t%s\n",nodeLevel2->name);
}
}
xmlSaveFile("xmlfile_copy.xml", doc);
xmlFreeDoc(doc);
return 0;
}
Para más info: http://student.santarosa.edu/~dturover/?node=libxml2


Cualquier cosa, decime y armo un par de ejemplos yo y te tiro un par de snapshots. Pero creo que está clarísimo en esa página.


Saludos,

Matías Dumrauf

Matías Dumrauf

unread,
Sep 18, 2010, 9:46:55 PM9/18/10
to c-t...@googlegroups.com
Recién leo mejor tu ejemplo y entendí lo que quería decir =P.

Sí, son atributos de determinado TAG.

La función, en principio, sería:

    xmlGetProp(xmlNodePtr node, xmlChar *name);


Una cosa más que yo probaría antes (si tengo tiempo claro, je): fijate cuando estás iterando, en el primer ejemplo que di, de preguntar si el type del nodo es XML_ATTRIBUTE_NODE (es otra macro, también mencionada en el link que te mandé). En ese caso, imprimí el node->name para corroborar.

Cito de nuevo el ejemplo que puse antes.

    for (nodo = nodo_root; nodo ; nodo = nodo->next)
    {
        for (nodo_children = nodo->children;
             nodo_children ;
             nodo_children = nodo_children->next)
        {

            if (nodo_children->type == XML_ATTRIBUTE_NODE)
            {
                if( !strcmp(nodo_children->name, "Newsgroup") == 0 )

                    printf("Newsgroup Name: %s\n", nodo_children->children->content);

                if( !strcmp(nodo_children->name, "IdNoticia")== 0 )

                    printf("News Id: %ld\n", atol(nodo_children->children->content);

                if( !strcmp(nodo_children->name, "Head") == 0 )

                    printf("News Head: %s\n", nodo_children->children->content);

                if( !strcmp(nodo_children->name, "Body") == 0 )

                    printf("News Body: %s\n", nodo_children->children->content);
            }

        }
    }

aaolivar

unread,
Sep 18, 2010, 11:02:05 PM9/18/10
to C Talks
No entendia bien porque decia text y porque a veces me tiraba
segfault. Esta muy bien explicado en la pagina esa.
Ahora le voy agarrando la mano.. muchas gracias por el ejemplo y el
link, muy utiles :D
Saludos

devolution

unread,
Sep 26, 2010, 5:44:47 AM9/26/10
to C Talks
por ejemplo cuando el nodo es:

<nombre>Adrian</nombre>

se usa

(char *)xmlNodeGetContent(unNodo);

unNodo tendria que estar parado sobre <nombre>

Matias Petrone

unread,
Sep 28, 2010, 8:19:29 PM9/28/10
to C Talks
tengo un problema

para un xml de "ejemplo" como este

<job name="job 1">
<target>
<hash>6e023d8b8758f8f826152de77a3cc1d9</hash>
<method>MD5</method>
<length>6</length>

cuando hago

root_element = xmlDocGetRootElement(doc);

root_element se para en job.

el problema es ahora cuando quiero pararme en target tengo q hacer lo
siguiente

cur_node = root_element->children->next;

recien ahi cur_node esta parado en target, lo mismo si quisiera
pararme en hash
deberia ir al hijo y al siguiente.

esto es normal? no deberia bastar con solo poner ->chidren sin poner
el next?

Saludos!

On 18 sep, 22:46, Matías Dumrauf <matias.dumr...@gmail.com> wrote:
> Recién leo mejor tu ejemplo y entendí lo que quería decir =P.
>
> Sí, son atributos de determinado TAG.
>
> La función, en principio, sería:
>
>     xmlGetProp(xmlNodePtr node, xmlChar *name);
>
> Una cosa más que yo probaría antes (si tengo tiempo claro, je): fijate
> cuando estás iterando, en el primer ejemplo que di, de preguntar si el type
> del nodo es XML_ATTRIBUTE_NODE (es otra macro, también mencionada en el link
> que te mandé). En ese caso, imprimí el node->name para corroborar.
>
> Cito de nuevo el ejemplo que puse antes.
>
>     for (nodo = nodo_root; nodo ; nodo = nodo->next)
>     {
>         for (nodo_children = nodo->children;
>              nodo_children ;
>              nodo_children = nodo_children->next)
>         {
>
>             if (*nodo_children->type == XML_ATTRIBUTE_NODE*)
>             {
>                 if( !strcmp(nodo_children->name, "Newsgroup") == 0 )
>                     printf("Newsgroup Name: %s\n",
> nodo_children->children->content);
>
>                 if( !strcmp(nodo_children->name, "IdNoticia")== 0 )
>                     printf("News Id: %ld\n",
> atol(nodo_children->children->content);
>
>                 if( !strcmp(nodo_children->name, "Head") == 0 )
>                     printf("News Head: %s\n",
> nodo_children->children->content);
>
>                 if( !strcmp(nodo_children->name, "Body") == 0 )
>                     printf("News Body: %s\n",
> nodo_children->children->content);
>             }
>
>         }
>     }
>
> El 18 de septiembre de 2010 22:20, Matías Dumrauf
> <matias.dumr...@gmail.com>escribió:
>
>
>
> > Agus, investigando un poco, encontré unos buenos ejemplos. Con ésto no creo
> > que tengas problemas.
>
> > #include <stdio.h>
> > #include <libxml/tree.h>
>
> > int main(){
> >    xmlDocPtr doc;
> >    xmlNodePtr nodeLevel1;
>
> >    xmlNodePtr nodeLevel2;
>
> >    doc = xmlParseFile("xmlfile.xml");
> >    for(    nodeLevel1 = doc->children;
> >            nodeLevel1 != NULL;
> >            nodeLevel1 = nodeLevel1->next)
> >    {
> >            printf("%s\n",nodeLevel1->name);
>
> >            for(    nodeLevel2 = nodeLevel1->children;
> >                    nodeLevel2 != NULL;
> >                    nodeLevel2 = nodeLevel2->next)
> >            {
> >                    printf("\t%s\n",nodeLevel2->name);
> >                    }
> >    }
> >    xmlSaveFile("xmlfile_copy.xml", doc);
>
> >    xmlFreeDoc(doc);
> >    return 0;
> > }
>
> > Para más info:http://student.santarosa.edu/~dturover/?node=libxml2<http://student.santarosa.edu/%7Edturover/?node=libxml2>
>
> > Cualquier cosa, decime y armo un par de ejemplos yo y te tiro un par de
> > snapshots. Pero creo que está clarísimo en esa página.
>
> > Saludos,
>
> > Matías Dumrauf
>
> >> c-talks+u...@googlegroups.com<c-talks%2Bunsu...@googlegroups.com >

aaolivar

unread,
Sep 29, 2010, 10:31:04 AM9/29/10
to C Talks
Proba un xml leido desde un char*, yo tuve un par de problemas
parecidos donde no pasaba bien a las subramas, o al sacar el contenido
decia 'text'. A veces los espacios y los \t complican un poco.
Saludos

Laura Sasal

unread,
Jan 12, 2011, 5:53:17 PM1/12/11
to c-t...@googlegroups.com
Hola gente, 

                     una consulta... alguien sabe cómo instalar libxml2 en solaris y cómo compilar?
Muchas gracias,
Laura

--
Recibiste este mensaje porque estás suscrito al Grupo "C Talks".
Si quieres publicar en este grupo, envía un mensaje de correo
electrónico a c-t...@googlegroups.com
Para anular la suscripción a este grupo, envía un mensaje a
c-talks+u...@googlegroups.com

Matías Dumrauf

unread,
Jan 25, 2011, 9:10:19 AM1/25/11
to c-t...@googlegroups.com
Hola Laura, cómo estás? Perdona la tardanza. Me fui unos días a la costa y no funcaba bien el 3G =P

El tema con la VM de Solaris y Libxml2 es algo antiguo ya. Pasa que están: o bien instaladas en otro path del sistema (/usr/include y /usr/lib, o los correspondientes en /usr/local) o bien simplemente no lo están.

La forma más simple es pasarle por WinSCP las carpetas correspondientes a los includes y a las lib (/usr/include/libxml2 y /usr/lib/libxml2) . Puede pasar que estén mal ubicadas -como dije antes, en /usr/local/lib y /usr/local/include-, en ese caso, copiarla al path dicho anteriormente.

La otra alternativa es bajarse la biblioteca desde www.xmlsoft.org e instalarla con el Makefile.


Cualquier cosa, me decís.

Saludos,

Matías Dumrauf

Laura Sasal

unread,
Jan 25, 2011, 11:58:28 AM1/25/11
to c-t...@googlegroups.com
Ok muchas gracias Matías,
Saludos

Reply all
Reply to author
Forward
0 new messages