• Jueves 14 de Noviembre de 2024, 08:01

Autor Tema:  Xml Y C++  (Leído 1404 veces)

nicokiki

  • Miembro MUY activo
  • ***
  • Mensajes: 298
    • Ver Perfil
Xml Y C++
« en: Martes 27 de Abril de 2004, 06:23 »
0
Hola gente, les escribo para preguntarles algo q se q es una pavada pero q me esta volviendo loco.
Estoy haciendo una clase "CXMLParser" y me surgio una duda. Antes q nada, les cuento q estoy usando la libxml2 bajo GNU/LINUX. Personalmente tengo la distribucion Mandrake 9.2, pero creo q no va al caso todo esto.

Les hago una pequeña introduccion:
Primero les digo q esto en si no es exactamente lo q estoy haciendo (porque seria demasiado largo de explicar y no va al problema en cuestion) pero la adaptacion q estoy pensando sirve perfectamente y creo q queda bastante clara.
Tengo una clase "CInfoDeArchivos", la cual tiene como atributos al nombre del archivo, la fecha de modificacion y al tamaño. Todos estos atributos son de tipo std::string . Tengo obviamente un "seter" para cada atributo.
La clase "CXMLParser" tiene como atributo a un objeto de la clase"CInfoDeArchivos" y por supuesto al "seter" correspondiente.
El problema viene en esta parte del XML q tengo:
.........
<ListaDeArchivos>
  <Archivo nombre='introduccion.txt' tamanio='5Kb' fechamodif='05042004'>
  <Archivo nombre='hola.txt' tamanio='50Kb' fechamodif='23022004'>
  <Archivo nombre='nada.txt' tamanio='37Kb' fechamodif='05092002'>
<ListaDeArchivos>
...........

Recorro perfectamente hasta q entro en ListaDeAcrhivos, entro perfectamente y hago algo asi:

xmlChar* ContenidoNombre;
xmlChar* ContenidoTamanio;
xmlChar* ContenidoFecha;
xmlAttr* Atributo;
CInfoDeArchivos Info;

Atributo = (xmlAttr *)NodoActual->properties;

while (Atributo != NULL)
{
    if (!xmlStrcmp(Atributo->name, (const xmlChar *) "NOMBRE"))
    {
      ContenidoNombre = xmlGetProp(NodoActual, Atributo->name);
      Info.setNombre(ContenidoNombre);
      xmlFree(ContenidoNombre);
    }
    if (!xmlStrcmp(Atributo->name, (const xmlChar *) "TAMANIO"))
    {
      ContenidoTamanio = xmlGetProp(NodoActual, Atributo->name);
      Info.setTamanio(ContenidoTamanio);
      xmlFree(ContenidoTamanio);
    }
    if (!xmlStrcmp(Atributo->name, (const xmlChar *) "FECHAMODIF"))
    {
      ContenidoFecha = xmlGetProp(NodoActual, Atributo->name);
      Info.setFecha(ContenidoFecha);
      xmlFree(ContenidoFecha);
    }
   
    Atributo = Atributo->next;
  }
  this->getComando().setArchivo(Info);


Y lo q hace la maldita aplicacion es cargar solo de una cosa a la vez. esto entiendo mas o menos porque lo hace, porque recorre los tres atributos del tag <Archivo> pero yo no cargo el "Info" hasta no salir del ultimo scope.
Como se ve, lo mio no tiene mucho q ver con el XML, pero quizas el ejemplo sirva de algo. Lo q me esta pasando es q no puedo setear un atributo de un objeto bien. No es q el seter este mal hecho ni nada de eso, es como q esta haciendo algo mal y no me doy cuenta.
Aclaro q los xmlFree() deben ir asi porque si no pincha todo.

Les mando salu2 y aquella persona q me pueda dar una mano, se los agradecere

nicokiki

  • Miembro MUY activo
  • ***
  • Mensajes: 298
    • Ver Perfil
Re: Xml Y C++
« Respuesta #1 en: Martes 27 de Abril de 2004, 06:25 »
0
Hola de nuevo, les quiero corregir unas cositas q escribi por ahi:
1.- El tag archivo me olvide de cerrarlo, perdon, pero no es q copie y pegue cosas, lo hice todo en el momento.
2.- Puse "cout" entre todos los "if", o sea, cuando iba geteando el contenido del XML y los tira perfecto por pantalla, asi q el problema es q los estoy seteando mal en la clase y no me doy ecuenta del error.

Salu2!!!!!!

nicokiki

  • Miembro MUY activo
  • ***
  • Mensajes: 298
    • Ver Perfil
Re: Xml Y C++
« Respuesta #2 en: Miércoles 28 de Abril de 2004, 04:53 »
0
Hola gente, les cuento q ya solucione el temita anterior de una manera medio india, pero
esta solucionado al fin y al cabo.
En conclusion, ya logre parsear un XML de un string de la stl. Ahora se viene el problema inverso.
El problema q ahora me lleva a escribirles es q no se como guardar el XML genrado en un string de la
STL ni en un char* ni en un xmlChar* ni en nada de eso (porque de cualquiera de esas tres
formas, con un simple casteo, puedo cargarlo en un string de la STL). Lo q si se hacer es
guardar el XML en un archivo.xml (haciendo xmlSaveFileEnc(const char* Filename, xmlDocPtr Document,
(const xmlChar*)Encoding ); ) pero en mi caso eso es innecesario ya q lo q tengo en XML viaja
por sockets.
Lo q querria saber seria algo asi q no se si existe: "xmlChar* xmlSaveMemory(Document, encoding)" y
los q encontre en los .h de la libreria no me resultan intuitivos a la vista. Si alguien sabe como
hacer esto q quiero, por favor escucho ofertas.

Salu2!!!!

nicokiki

  • Miembro MUY activo
  • ***
  • Mensajes: 298
    • Ver Perfil
Re: Xml Y C++
« Respuesta #3 en: Jueves 29 de Abril de 2004, 02:36 »
0
Ya lo solucione

Salu2!!!!

P.D.: si a alguien le interesa la parte de XML del proyecto q estoy haciendo, pidanmelo y se los dare. Quizas, si yo veia esto q estoy ofreciendo ahora una o dos semanas atras, realmente me interesaria.
La idea es escribir un mini tutorial del uso de esta libreria, aplicado a mi caso en particular, pero el problema es q no tengo mucho tiempo. Tambien quisiera escribir algo de como conectarse a Interbase desde JAVA. Si a alguien le interesa, insisto, diganmelo. No sere un crack en esto, pero puede ser muy util.
Les aclaro de antemano q uso C++ y no C, o sea, todo es OOP en mi proyecto aunque la libxml2 este escrita en C.

Salu2!!!! nuevamente :hola: