[phpBB Debug] PHP Warning: in file [ROOT]/includes/bbcode.php on line 128: preg_replace(): The /e modifier is no longer supported, use preg_replace_callback instead
[phpBB Debug] PHP Warning: in file [ROOT]/includes/bbcode.php on line 128: preg_replace(): The /e modifier is no longer supported, use preg_replace_callback instead
[phpBB Debug] PHP Warning: in file [ROOT]/includes/bbcode.php on line 128: preg_replace(): The /e modifier is no longer supported, use preg_replace_callback instead
[phpBB Debug] PHP Warning: in file [ROOT]/includes/bbcode.php on line 128: preg_replace(): The /e modifier is no longer supported, use preg_replace_callback instead
[phpBB Debug] PHP Warning: in file [ROOT]/includes/bbcode.php on line 128: preg_replace(): The /e modifier is no longer supported, use preg_replace_callback instead
[phpBB Debug] PHP Warning: in file [ROOT]/includes/bbcode.php on line 128: preg_replace(): The /e modifier is no longer supported, use preg_replace_callback instead
[phpBB Debug] PHP Warning: in file [ROOT]/includes/bbcode.php on line 128: preg_replace(): The /e modifier is no longer supported, use preg_replace_callback instead
[phpBB Debug] PHP Warning: in file [ROOT]/includes/bbcode.php on line 128: preg_replace(): The /e modifier is no longer supported, use preg_replace_callback instead
[phpBB Debug] PHP Warning: in file [ROOT]/includes/bbcode.php on line 128: preg_replace(): The /e modifier is no longer supported, use preg_replace_callback instead
[phpBB Debug] PHP Warning: in file [ROOT]/includes/bbcode.php on line 128: preg_replace(): The /e modifier is no longer supported, use preg_replace_callback instead
[phpBB Debug] PHP Warning: in file [ROOT]/includes/bbcode.php on line 128: preg_replace(): The /e modifier is no longer supported, use preg_replace_callback instead
[phpBB Debug] PHP Warning: in file [ROOT]/includes/bbcode.php on line 128: preg_replace(): The /e modifier is no longer supported, use preg_replace_callback instead
[phpBB Debug] PHP Warning: in file [ROOT]/includes/bbcode.php on line 128: preg_replace(): The /e modifier is no longer supported, use preg_replace_callback instead
[phpBB Debug] PHP Warning: in file [ROOT]/includes/bbcode.php on line 128: preg_replace(): The /e modifier is no longer supported, use preg_replace_callback instead
[phpBB Debug] PHP Warning: in file [ROOT]/includes/bbcode.php on line 128: preg_replace(): The /e modifier is no longer supported, use preg_replace_callback instead
[phpBB Debug] PHP Warning: in file [ROOT]/includes/bbcode.php on line 128: preg_replace(): The /e modifier is no longer supported, use preg_replace_callback instead
[phpBB Debug] PHP Warning: in file [ROOT]/includes/functions.php on line 4714: Cannot modify header information - headers already sent by (output started at [ROOT]/includes/functions.php:3823)
[phpBB Debug] PHP Warning: in file [ROOT]/includes/functions.php on line 4716: Cannot modify header information - headers already sent by (output started at [ROOT]/includes/functions.php:3823)
[phpBB Debug] PHP Warning: in file [ROOT]/includes/functions.php on line 4717: Cannot modify header information - headers already sent by (output started at [ROOT]/includes/functions.php:3823)
[phpBB Debug] PHP Warning: in file [ROOT]/includes/functions.php on line 4718: Cannot modify header information - headers already sent by (output started at [ROOT]/includes/functions.php:3823)
curiosoperoinutil.com :: Ver Tema - Parser de XML para C/C++
curiosoperoinutil.com
https://curiosoperoinutil.com/forum/

Parser de XML para C/C++
https://curiosoperoinutil.com/forum/viewtopic.php?f=6&t=2523
Página 1 de 1

Autor:  EvilWolf [ Mié 03 Ene 2007, 04:14 ]
Asunto:  Parser de XML para C/C++

A ver que os comente. Para el proyecto del máster hay una parte que para trabajar con datos vamos a usar XML. Encontré la api Xerces para XML en C/C++ y tras las primeras pruebas y después de pegarme un poco con él, parece que me iba bastante bien y tenía poco que adaptar.

El problema ha venido cuando he querido navegar por el documento DOM y es que no hay manera de manejar atributos, porque, o casca por no sé qué movida del tipo de llamada de la función o rasca por otro lado que tampoco sé por qué es. Lo que tengo claro es que no es por mi código, porque algo tan sencillito:

[...] // código que ya funcionaba antes y que básicamente
// crea un árbol DOM a partir de un fichero XML


DOMElementImpl* raiz = (DOMElementImpl*) doc->getDocumentElement();
DOMElementImpl* nivel = (DOMElementImpl*) raiz->getFirstChild();


XMLCh* name = XMLString::transcode("name");
DOMAttr* attr = nivel->getAttributeNode(name);
char* mostrar = XMLString::transcode(attr->getValue());
cout << "El nombre del mapa es " << mostrar << endl;


no tiene nada del otro mundo. Como habréis podido observar, utiliza su propio char*, que lo llama XMLCh (lo que luego viene a ser un unsigned short*). Bueno, pues al hace la llamada nivel->getAttributeNode(name); rasca en código del propio Xerces un error muy raro.

La línea en la que rasca es:

XMLCh* newString;
XMLCh temp[4000];
>>> if (len >= 3999) //sí en el if rasca - el valor de len es 2
newString = (XMLCh*) ((DOMDocumentImpl *)node->getOwnerDocument())->getMemoryManager()->allocate



y el error que me da el Mierdasoft Visual Studio es:

Excepción no controlada en 0x7c81eb33 en PruebaXML.exe: Microsoft C++ exception: xercesc_2_7::DOMException @ 0x0012cca0.

De verdad que estoy hasta los mismísimos. He probado unas cuantas variantes, pero no funciona ninguna por diversos motivos. Si alguno sabéis de algún parser, alguna api o, simplemente, código que funcione, aunque lo tenga que adaptar, os lo agradecería enormemente, porque llevo 2 días seguidos aquí parado y no avanzo.

Obviamente, si conocéis cuál es el error, mejor que mejor, pero así, a pelo y sin contexto sé que es muy difícil.


PD: ¿Esto debería ir aquí o en el Consultorio?

Autor:  Heimy [ Mié 03 Ene 2007, 15:03 ]
Asunto: 


Autor:  EvilWolf [ Mié 03 Ene 2007, 16:14 ]
Asunto: 


Autor:  Heimy [ Mié 03 Ene 2007, 16:40 ]
Asunto: 


Autor:  EvilWolf [ Mié 03 Ene 2007, 16:59 ]
Asunto: 


Autor:  EvilWolf [ Mié 03 Ene 2007, 17:06 ]
Asunto: 

Volviendo a probar lo que acabo de postear, me ha rascado como te he comentado. El tema es que he "limpiado" la solución de Visual Studio y milagrosamente ahora sí que compila. Esto de que tengas que limpiar la solucion es una chapuza de coj****.

Pero bueno, aún dejando de usar el DOMElementImpl y usar el DOMElement y habiendo limpiado la solución, sigue rascando al ejecutar los métodos del DOMElement.

Si en vez de coger el atributo entero, sólo cojo el valor, que era lo que hacía al principio, en vez de salir el error de arriba pone:

Run-Time Check Failure #0 - The value of ESP was not properly saved across a function call. This is usually a result of calling a function declared with one calling convention with a function pointer declared with a different calling convention.

Para el código:

DOMElement* raiz = doc->getDocumentElement();
DOMElement* nivel = (DOMElement*) raiz->getFirstChild();
DOMElement* size = (DOMElement*) nivel->getFirstChild();

XMLCh* name = XMLString::transcode("name");
XMLCh* attr = (XMLCh*) nivel->getAttribute(name);
char* mostrar = XMLString::transcode(attr);
cout << "El nombre del mapa es " << mostrar << endl;


He leído por ahí, que el error se debe a que no se utiliza la convención de función como se debiera o que se usa una distinta. Pero vamos, que tampoco sé cómo arreglarlo.

Autor:  Heimy [ Mié 03 Ene 2007, 17:16 ]
Asunto: 


Autor:  EvilWolf [ Mié 03 Ene 2007, 17:20 ]
Asunto: 

Vale, mecagüen... :proteston: :proteston: :proteston: :proteston:
:proteston: :proteston: :proteston: :proteston: :proteston: :proteston:

Viene siendo que el problema era que no crea bien el árbol DOM, ya que si tengo el XML así:

<?xml version="1.0" encoding="UTF-8" standalone="no" ?>
<niveles><nivel name='Mapa'><size tilesX='4' tilesY='5'/></nivel></niveles>


O séase, sin espacio alguno entre los elementos, funciona perfectamente. Vamos que como la parte de leer el XML y parsearlo yo me pensaba que ya la hacía perfectamente porque al mostrarlo por pantalla se veía todo bien y al copiarlo a un fichero también pues ya pasé.

Así que resulta que debe haber una opción para que se trague los espacios, los retornos de carro y las tabulaciones.

Heimy, ¿sabes por casualidad cuál es esa opción o parámetro? Si no la sabes o no te acuerdas no lo andes buscando, que lo busco yo.

De verdad, como me revientan estas cosas. Ver que llevas 2 días con lo mismo, que no tira y luego descubres que es por tan tremenda memez...
:proteston: :proteston: :proteston: :proteston: :proteston:

En fin, a ver si puedo recuperar el tiempo perdido...

Autor:  Heimy [ Mié 03 Ene 2007, 17:43 ]
Asunto: 


Autor:  EvilWolf [ Mié 03 Ene 2007, 17:47 ]
Asunto: 


Autor:  Heimy [ Mié 03 Ene 2007, 18:11 ]
Asunto: 


Autor:  Heimy [ Mié 03 Ene 2007, 18:46 ]
Asunto: 


Autor:  EvilWolf [ Jue 04 Ene 2007, 00:02 ]
Asunto: 


Autor:  EvilWolf [ Jue 04 Ene 2007, 00:38 ]
Asunto: 


Página 1 de 1 Todos los horarios son UTC + 1 hora [ DST ]
Powered by phpBB® Forum Software © phpBB Group
http://www.phpbb.com/