c++ boost xml-parsing boost-propertytree

Análisis de archivo XML con Boost C++



xml-parsing boost-propertytree (1)

Tengo que analizar un archivo xml usando boost c ++, he escrito un código de prueba que funciona para este xml. a.xml

<a> <modules> <module>abc</module> <module>def</module> <module>ghi</module> </modules> </a>

La salida está llegando

abc def ghi

pero para este archivo a.xml , mi código de prueba no muestra ninguna salida, 3 líneas en blanco vienen como salida.

<a> <modules> <module value = "abc"/> <module value = "def"/> <module value = "abc"/> </modules> </a>

aquí está el código de prueba:

#include <boost/property_tree/ptree.hpp> #include <boost/property_tree/xml_parser.hpp> #include <boost/foreach.hpp> #include <iostream> int main() { using boost::property_tree::ptree; ptree pt; read_xml("a.xml",pt); BOOST_FOREACH(ptree::value_type &v, pt.get_child("a.modules")) std::cout<<v.second.data()<<std::endl; return 0; }

Mi problema es que estoy teniendo un gran archivo xml que contiene la mezcla de patrones de ambos archivos y tengo que analizarlo. El archivo es b.xml y tengo que obtener la subetiqueta del mensaje de cada etiqueta.

<MultiMessage> <Message structID="1710" msgID="0" length="50"> <structure type="AppHeader"> </structure> </Message> <Message structID="27057" msgID="27266" length="315"> <structure type="Container"> <productID value="166"/> <publishTo value="xyz"/> <templateID value="97845"/> <sendingTime value="1421320622367060444"/> <message value="092374NMKLA90U345N09832LJKN0A9845JHKLASDF09U8426LJAKLJDGF09845U6KLJSDGP89U45LJSDFP9GU4569078LJK"/> </structure> </Message> </MultiMessage> <MultiMessage> <Message structID="1710" msgID="0" length="50"> <structure type="AppHeader"> </structure> </Message> <Message structID="27057" msgID="27266" length="315"> <structure type="Container"> <productID value="166"/> <publishTo value="xyz"/> <templateID value="97845"/> <sendingTime value="1421320622367060444"/> <message value="092374NMKLA90U345N09832LJKN0A9845JHKLASDF09U8426LJAKLJDGF09845U6KLJSDGP89U45LJSDFP9GU4569078LJK"/> </structure> </Message> </MultiMessage> <MultiMessage> <Message structID="1710" msgID="0" length="50"> <structure type="AppHeader"> </structure> </Message> <Message structID="27057" msgID="27266" length="315"> <structure type="Container"> <productID value="166"/> <publishTo value="xyz"/> <templateID value="97845"/> <sendingTime value="1421320622367060444"/> <message value="092374NMKLA90U345N09832LJKN0A9845JHKLASDF09U8426LJAKLJDGF09845U6KLJSDGP89U45LJSDFP9GU4569078LJK"/> </structure> </Message> </MultiMessage>

y la salida debería ser:

092374NMKLA90U345N09832LJKN0A9845JHKLASDF09U8426LJAKLJDGF09845U6KLJSDGP89U45LJSDFP9GU4569078LJK 092374NMKLA90U345N09832LJKN0A9845JHKLASDF09U8426LJAKLJDGF09845U6KLJSDGP89U45LJSDFP9GU4569078LJK 092374NMKLA90U345N09832LJKN0A9845JHKLASDF09U8426LJAKLJDGF09845U6KLJSDGP89U45LJSDFP9GU4569078LJK

Gracias

Saludos


Documentación de Boost :

Los atributos de un elemento XML se almacenan en la subclave. Hay un nodo hijo por atributo en el nodo de atributo. La existencia del nodo no está garantizada o es necesaria cuando no hay atributos.

<module value = "abc"/> //One way would be this: boost::get<std::string>("module.<xmlattr>.value");

Una forma más (no probada), que parece ser mejor:

BOOST_FOREACH(boost::property_tree::ptree::value_type &v, pt.get_child("a.modules")) { std::cout << v.second.get_child("<xmlattr>.type").data() << std::endl; std::cout << v.second.get_child("<xmlattr>.Reference").data() << std::endl; }

Una más tomada de aquí.

//Parse XML... BOOST_FOREACH(boost::property_tree::ptree::value_type &v, pt.get_child("a.modules")) { const boost::property_tree::ptree &attributes = v.second.get_child("<xmlattr>", boost::property_tree::ptree()); BOOST_FOREACH(const boost::property_tree::ptree::value_type &v, attributes) { std::cout << v.first.data() << std::endl; std::cout << v.second.data() << std::endl; } }