Mejor formato XML usando BOOST? [duplicar] -- ++ campo con xml campo con boost campo con ptree camp Relacionados El problema

Better XML formatting using Boost? [duplicate]


1
vote

problema

Español
Esta pregunta ya tiene respuestas aquí :
Boost :: Property_Tree XML Pretty Printing (3 respuestas)
Cerrado hace 6 años .

Estoy usando árboles de propiedades de impulsión para exportar mis instantes de clase como nodos XML. Funciona, pero simplemente pone todo en 1 línea. Me gustaría que tenga sangrías, como:

  <?xml version="1.0" encoding="utf-8"?> <root> <sensorconfigurations>     <configuration>         <name>SensorConfiguration1</name>         <sensorid>1</sensorid>         <signalindex>1</signalindex>         <mappingscheme>mappingscheme1</mappingscheme>         <soundpack>test1.wav</soundpack>     </configuration>     <configuration>         <name>SensorConfiguration2</name>         <sensorid>2</sensorid>         <signalindex>2</signalindex>         <mappingscheme>mappingscheme1</mappingscheme>         <soundpack>test2.wav</soundpack>     </configuration>     <configuration>         <name>SensorConfiguration3</name>         <sensorid>3</sensorid>         <signalindex>3</signalindex>         <mappingscheme>mappingscheme2</mappingscheme>         <soundpack>test3.wav</soundpack>     </configuration> </sensorconfigurations> </root>   

es esto posible de alguna manera? ¿Falta un parámetro en el método write_xml?

Aquí está mi código:

  void SensorConfigurationBank::save() { using boost::property_tree::ptree; ptree pt; for(map<string, SensorConfiguration>:: iterator it = sensorConfigurations_.begin(); it != sensorConfigurations_.end(); ++it)  {     ptree myTree;     myTree.put("name", it->second.getName());     myTree.put("sensorid", it->second.getSensorID());     myTree.put("signalindex", it->second.getsignalIndex());     MappingScheme myScheme = it->second.getMScheme();     myTree.put("mappingscheme", myScheme.getId());     SoundPack mySound = it->second.getSound();     myTree.put("soundpack", mySound.filepath_);      pt.add_child("root.sensorconfigurations.configuration", myTree); } write_xml("SensorConfigurationBank2.xml", pt);  }   
Original en ingles

I'm using Boost Property Trees to export my class-instants as XML nodes. It works but it just puts everything in 1 line. I would like it to have indents, like:

<?xml version="1.0" encoding="utf-8"?> <root> <sensorconfigurations>     <configuration>         <name>SensorConfiguration1</name>         <sensorid>1</sensorid>         <signalindex>1</signalindex>         <mappingscheme>mappingscheme1</mappingscheme>         <soundpack>test1.wav</soundpack>     </configuration>     <configuration>         <name>SensorConfiguration2</name>         <sensorid>2</sensorid>         <signalindex>2</signalindex>         <mappingscheme>mappingscheme1</mappingscheme>         <soundpack>test2.wav</soundpack>     </configuration>     <configuration>         <name>SensorConfiguration3</name>         <sensorid>3</sensorid>         <signalindex>3</signalindex>         <mappingscheme>mappingscheme2</mappingscheme>         <soundpack>test3.wav</soundpack>     </configuration> </sensorconfigurations> </root> 

Is this possible somehow? Am I missing a parameter in the write_xml method?

Here's my code:

void SensorConfigurationBank::save() { using boost::property_tree::ptree; ptree pt; for(map<string, SensorConfiguration>:: iterator it = sensorConfigurations_.begin(); it != sensorConfigurations_.end(); ++it)  {     ptree myTree;     myTree.put("name", it->second.getName());     myTree.put("sensorid", it->second.getSensorID());     myTree.put("signalindex", it->second.getsignalIndex());     MappingScheme myScheme = it->second.getMScheme();     myTree.put("mappingscheme", myScheme.getId());     SoundPack mySound = it->second.getSound();     myTree.put("soundpack", mySound.filepath_);      pt.add_child("root.sensorconfigurations.configuration", myTree); } write_xml("SensorConfigurationBank2.xml", pt);  } 
           
       
       

Lista de respuestas

5
 
vote
vote
La mejor respuesta
 

En estos días, xml_writer_settings aparentemente toma un tipo de cadena como argumento de la plantilla, por lo que:

  boost::property_tree::xml_writer_settings<std::string> settings(' ', 1); write_xml(std::cout, pt, settings);    

hará el truco. Muestra completa:

en vivo en coliru

  #include <boost/property_tree/ptree.hpp> #include <boost/property_tree/xml_parser.hpp> #include <map> #include <iostream>  struct SoundPack {     std::string filepath_ = "soundpack.wav"; }; struct MappingScheme {     std::string getId()    const { return "Id";    } }; struct SensorConfiguration {     std::string   getName()        const { return "Name";        }     std::string   getSensorID()    const { return "SensorID";    }     std::string   getsignalIndex() const { return "signalIndex"; }     SoundPack     getSound()       const { return {};            }     MappingScheme getMScheme()     const { return {};            } };  void save(std::map<std::string, SensorConfiguration> sensorConfigurations_) {     using boost::property_tree::ptree;     ptree pt;     for(std::map<std::string, SensorConfiguration>:: iterator it = sensorConfigurations_.begin(); it != sensorConfigurations_.end(); ++it)      {         ptree myTree;          MappingScheme myScheme = it->second.getMScheme();         SoundPack mySound = it->second.getSound();          myTree.put("name",          it->second.getName());         myTree.put("sensorid",      it->second.getSensorID());         myTree.put("signalindex",   it->second.getsignalIndex());         myTree.put("mappingscheme", myScheme.getId());         myTree.put("soundpack",     mySound.filepath_);          pt.add_child("root.sensorconfigurations.configuration", myTree);     }     boost::property_tree::xml_writer_settings<std::string> settings(' ', 1);     write_xml(std::cout, pt, settings);  }  int main() {     save({             { "first",  SensorConfiguration {} },             { "second", SensorConfiguration {} },             { "third",  SensorConfiguration {} },             { "fourth", SensorConfiguration {} }         }); }   

Salida:

  <?xml version="1.0" encoding="utf-8"?> <root>     <sensorconfigurations>         <configuration>             <name>Name</name>             <sensorid>SensorID</sensorid>             <signalindex>signalIndex</signalindex>             <mappingscheme>Id</mappingscheme>             <soundpack>soundpack.wav</soundpack>         </configuration>         <configuration>             <name>Name</name>             <sensorid>SensorID</sensorid>             <signalindex>signalIndex</signalindex>             <mappingscheme>Id</mappingscheme>             <soundpack>soundpack.wav</soundpack>         </configuration>         <configuration>             <name>Name</name>             <sensorid>SensorID</sensorid>             <signalindex>signalIndex</signalindex>             <mappingscheme>Id</mappingscheme>             <soundpack>soundpack.wav</soundpack>         </configuration>         <configuration>             <name>Name</name>             <sensorid>SensorID</sensorid>             <signalindex>signalIndex</signalindex>             <mappingscheme>Id</mappingscheme>             <soundpack>soundpack.wav</soundpack>         </configuration>     </sensorconfigurations> </root>   
 

These days, xml_writer_settings apparently takes a string type as template argument, so:

boost::property_tree::xml_writer_settings<std::string> settings('\t', 1); write_xml(std::cout, pt, settings);  

will do the trick. Full sample:

Live On Coliru

#include <boost/property_tree/ptree.hpp> #include <boost/property_tree/xml_parser.hpp> #include <map> #include <iostream>  struct SoundPack {     std::string filepath_ = "soundpack.wav"; }; struct MappingScheme {     std::string getId()    const { return "Id";    } }; struct SensorConfiguration {     std::string   getName()        const { return "Name";        }     std::string   getSensorID()    const { return "SensorID";    }     std::string   getsignalIndex() const { return "signalIndex"; }     SoundPack     getSound()       const { return {};            }     MappingScheme getMScheme()     const { return {};            } };  void save(std::map<std::string, SensorConfiguration> sensorConfigurations_) {     using boost::property_tree::ptree;     ptree pt;     for(std::map<std::string, SensorConfiguration>:: iterator it = sensorConfigurations_.begin(); it != sensorConfigurations_.end(); ++it)      {         ptree myTree;          MappingScheme myScheme = it->second.getMScheme();         SoundPack mySound = it->second.getSound();          myTree.put("name",          it->second.getName());         myTree.put("sensorid",      it->second.getSensorID());         myTree.put("signalindex",   it->second.getsignalIndex());         myTree.put("mappingscheme", myScheme.getId());         myTree.put("soundpack",     mySound.filepath_);          pt.add_child("root.sensorconfigurations.configuration", myTree);     }     boost::property_tree::xml_writer_settings<std::string> settings('\t', 1);     write_xml(std::cout, pt, settings);  }  int main() {     save({             { "first",  SensorConfiguration {} },             { "second", SensorConfiguration {} },             { "third",  SensorConfiguration {} },             { "fourth", SensorConfiguration {} }         }); } 

Output:

<?xml version="1.0" encoding="utf-8"?> <root>     <sensorconfigurations>         <configuration>             <name>Name</name>             <sensorid>SensorID</sensorid>             <signalindex>signalIndex</signalindex>             <mappingscheme>Id</mappingscheme>             <soundpack>soundpack.wav</soundpack>         </configuration>         <configuration>             <name>Name</name>             <sensorid>SensorID</sensorid>             <signalindex>signalIndex</signalindex>             <mappingscheme>Id</mappingscheme>             <soundpack>soundpack.wav</soundpack>         </configuration>         <configuration>             <name>Name</name>             <sensorid>SensorID</sensorid>             <signalindex>signalIndex</signalindex>             <mappingscheme>Id</mappingscheme>             <soundpack>soundpack.wav</soundpack>         </configuration>         <configuration>             <name>Name</name>             <sensorid>SensorID</sensorid>             <signalindex>signalIndex</signalindex>             <mappingscheme>Id</mappingscheme>             <soundpack>soundpack.wav</soundpack>         </configuration>     </sensorconfigurations> </root> 
 
 
 
 

Relacionados problema

4  Camino XML al segundo hijo  ( Xml path to second child ) 
Quiero poner un nuevo valor a un niño dentro de un ptree a través de la ruta (sin iteración) como ejemplo: #include <iostream> #include <boost/property_t...

2  Aumentar la matriz de nivel superior ptree  ( Boost ptree top level array ) 
Me gustaría tener write_json emite una matriz de nivel superior, algo al efecto de: [{...},{...},{...},...,{...}] Pero cuando paso una lista a // Ri...

0  BOOST PTREE usado solo para leer el archivo o para almacenar los valores también?  ( Boost ptree used just for reading file or for storing the values too ) 
Tengo un archivo de configuración, eso es un JSON. He creado una clase (ConfigFile) que lee ese archivo y almacena los valores (usando Parser Boost y PTREE). ...

1  Obtenga un valor de JSON usando PTREE en C ++ si el nombre de la tecla es con puntos (.)  ( Get value from json using ptree in c if key name is with dots ) 
Intenté usar PTREE para buscar el valor de la tecla en C ++ para que el nombre de la clave tenga múltiple. en llaves. Entonces tengo JSON, cellRangeRende...

8  ¿Cómo puedo obtener el número de línea XML de la excepción de PTREE?  ( How can i get xml line number from ptree exception ) 
Estoy usando BOOST PTREE para leer un archivo XML como este: row,id,value 1, 1, 'A' 2, 1, 'B' 3, 1, 'C' 2 Sé que puedo usar la función componentDid...

1  ptree get_value con nombre incluyendo ""  ( Ptree get value with name including ) 
"A": "1" "A.B": "2" "A.C": "3" Cómo obtener el valor de A.B Si no me gustaría a través de la ptree funciona. Si lo intento Para obtener el valor de pt...

1  Declaración hacia adelante de Typedef  ( Forward declaration of typedef ) 
Tengo el siguiente código: namespace boost { namespace property_tree { template<class Key, class Data, class KeyCompare> class basic_pt...

0  ¿Cómo puedo leer una matriz de objetos de un archivo JSON usando Boost-Property-Tree en C ++  ( How can i read an array of object from a json file using boost property tree in ) 
Estoy usando el árbol de Boost-Property-Tree en una aplicación C ++, donde estoy tratando de leer un archivo JSON users.json y almacenar los datos en un vec...

0  BOOST PTREE READE_INI CRESCAS APLICACIÓN INDIVIDADA  ( Boost ptree read ini crashes standalone application ) 
Estoy usando bloques de código y wxwidgets con el compilador MINGW en Windows. Bajo las opciones de construcción de Project, & gt; directorios de búsqueda- & ...

0  Cambiando el tipo de datos del árbol de la propiedad Boost  ( Changing the data type of boost property tree ) 
Basado en mi publicación anterior aquí, lo tomo de que no es posible leer un archivo XML directamente en un árbol de propiedades de char16_t . https: // S...




© 2022 respuesta.top Reservados todos los derechos. Centro de preguntas y respuestas reservados todos los derechos