2010-03-12 11 views
7

RapidXML es un analizador de DOM XML de C++ rápido y liviano, pero tiene algunos caprichos.Cómo solucionar problemas de propiedad de RapidXML String?

El peor de éstos a la mente es la siguiente:

3,2 Propiedad de cadenas.

Los nodos y atributos producidos por RapidXml no son poseen sus cadenas de nombre y valor. Ellos simplemente sostienen los punteros hacia ellos. Esto significa que debe tener cuidado cuando establezca estos valores manualmente, por usando xml_base::name(const Ch *) o xml_base::value(const Ch *) funciones.

Se debe tener cuidado para asegurar que vida útil de la cadena pasada está en menos tan largo como la vida de la nodo/atributo. La forma más fácil de lograrlo es asignar la cadena desde memory_pool propiedad del documento . Utilice memory_pool::allocate_string() función para este propósito.

Ahora, entiendo que se ha hecho así por la velocidad, pero esto se siente como un accidente automovilístico esperando a suceder. El siguiente código parece inocuo, pero 'nombre' y 'valor' están fuera del alcance cuando devuelve foo, por lo que el documento no está definido.

void foo() 
{ 
    char name[]="Name"; 
    char value[]="Value"; 

    doc.append_node(doc.allocate_node(node_element, name, value)); 
} 

La sugerencia de utilizar allocate_string() según los trabajos manuales, pero es tan fácil de olvidar.

¿Alguien ha 'mejorado' RapidXML para evitar este problema?

+0

¿No sería mejor "rapidxml" estar en contra de su espíritu? Es un analizador súper rápido y la falta de propiedad es una parte clave de esto. –

+0

OK, tal vez un "envoltorio" es un término mejor. Pero no hay nada intrínsecamente malo en tener una interfaz * adicional * "más segura" ... Depende de los usuarios elegir la velocidad o la fragilidad. – Roddy

+0

En este caso, no hay "nombre" y "valor" estáticos en el montón, por lo que tienen alcance en todo el programa. – Mark

Respuesta

1

No uso RapidXML, pero tal vez mi enfoque puede resolver su problema.

Empecé a usar Xerces, pero lo encontré pesado, además de otras molestias menores, así que me mudé a CPPDOM. Cuando hice el cambio, decidí crear un conjunto de clases contenedoras, para que mi código no dependiera del 'motor' XML específico y pudiera transferirlo a otro si fuera necesario.

Creé mis propias clases para representar las entidades DOM básicas (nodo, documento, etc.). Esas clases usan internamente el idioma pimpl para usar objetos CPPDOM. Dado que mi objeto nodo contiene el objeto nodo "real" (de CPPDOM) puedo administrar cualquier cosa según sea necesario, por lo que la asignación correcta y la desasignación de cadenas de caracteres no serían un problema allí.

Como mi código es para CPPDOM, no creo que sea muy útil para usted, pero puedo publicarlo si lo desea.

BTW, si ya tiene demasiado código que ya usa RapidXML, puede reproducir sus interfaces en sus clases contenedoras. No lo hice porque el código que usaba Xerces no era tan largo y tendría que volver a escribirlo de todos modos.

+0

Quizás no sea la respuesta que estaba buscando, pero es lo mejor que voy a obtener. ¡Gracias! – Roddy

Cuestiones relacionadas