2011-04-10 30 views
5

Antes de comenzar a escribir con la biblioteca de configuración propia, pensé que trataría de encontrar una existente. Busqué en Google y encontré mucho para C# o MFC pero nada que use C++/STL simple. Me gustaría algo que permita el acceso a través de claves tales como:Biblioteca C++ para almacenar configuraciones en XML

mySettings["Root"]["Subsection"]["Value"].Value 

O algo así. ¿Hay algo que pueda proporcionar ese tipo de interfaz a un archivo XML o voy a tener que hacer mi propio?

Gracias, J

+0

¿Por qué XML? ¿Realmente desea que las personas cambien su configuración desde fuera del programa? Tendrás que analizar toda esa porquería y luego validarla. ¿Tiene que ser humano legible desde fuera del programa? ¿Necesita ser independiente de la máquina/arquitectura? Crea una estructura que contenga todas tus configuraciones. Cree un archivo del mismo tamaño, mmap el archivo y superponga la estructura. Ahora tiene una copia binaria de la estructura en el disco. Agrega bloqueo de archivos y puedes tener múltiples procesos para compartir la configuración. Recuéstate y gana. – Angelom

+2

Si bien XML no es perfecto, tiene la ventaja de "solo funciona" con la ventaja añadida de que, en caso de que agregue una configuración más adelante, ni las revisiones más antiguas ni las más nuevas se bloquearán y se quemarán, en lugar de un formato binario. El mero hecho de que XML sea legible por humanos no es una desventaja. Por supuesto, siempre tendrás un tonto que romperá su configuración de edición en un editor de texto porque, si es XML, entonces * debes * editar * tus archivos de configuración manualmente, pero ese es su problema, no el tuyo. La misma gente posiblemente intente editar un archivo binario en un editor hexadecimal también. – Damon

Respuesta

7

No es TinyXML y pugixml

PugiXML tiene el apoyo XPath

+0

+1 para TinyXML. TinyXML ha funcionado de manera confiable como back-end de configuración para Code :: Blocks durante varios años en muchas revisiones. Algunas fallas en la etapa inicial debido a suposiciones ingenuas sobre datos de entrada aparte, nunca han dado ningún problema. – Damon

+0

+ 1 pugixml parece interesante – Ralf

+1

pugixml es perfecto. He reemplazado el sistema de configuración existente basado en el registro con él en solo unas horas y está funcionando muy bien. – JWood

5

Boost property tree es uno de esos biblioteca si usted tiene que considerar si usted quiere traer en el impulso sólo para este propósito. Funciona bien para las propiedades de configuración simples como se ilustra en el ejemplo, aunque Recuerdo hacer algo más complejo Me tomó un poco más de tiempo para hacerlo bien:

El siguiente código se toma de la documentación:

// Create an empty property tree object 
using boost::property_tree::ptree; 
ptree pt; 

// Load the XML file into the property tree. If reading fails 
// (cannot open file, parse error), an exception is thrown. 
read_xml(filename, pt); 

// Get the filename and store it in the m_file variable. 
// Note that we construct the path to the value by separating 
// the individual keys with dots. If dots appear in the keys, 
// a path type with a different separator can be used. 
// If the debug.filename key is not found, an exception is thrown. 
m_file = pt.get<std::string>("debug.filename"); 
+0

Gracias por la sugerencia, era un poco reacio a traer impulso solo para esta tarea, pero al final pugixml hizo el truco. – JWood

+0

@JWood: ¿por qué? es solo una biblioteca de encabezado. bastante bonito – Inverse

+0

@Inverso: he analizado el impulso antes y me he visto desilusionado principalmente por el número de otras partes de impulso en las que cada parte dependía. Puede que sea incorrecto aquí, pero me pareció que para obtener un componente por lo general era necesario agregar una gran cantidad de otros componentes. Es cierto que fue solo una breve mirada, pero tuve visiones de Qt y la tonelada de archivos DLL adicionales que deben agregarse. – JWood

0

Todos respuestas interesantes Pero debo enfatizar que hasta que C++ proporcione su propia API XML, usar un verdadero archivo de configuración XML e implementar su propia clase personalizada de Configuración XML es la mejor manera de hacerlo. Hoy me enfrento a la misma tarea, y esta es la solución que voy a usar. Puede ver en blanco y negro la configuración, porque está manteniendo su propio esquema XML. Entonces su clase de Configuración XML está personalizada para analizar ese esquema sin sobrecargar su solución con una plétora de características y complejidades superfluas. Simple/conciso y práctico/= bloatware.

Cuestiones relacionadas