Analyse des attributs XML avec Boost

Je voudrais partager avec vous une question que je vais avoir en essayant de traiter certains des attributs à partir d'éléments XML en C++ avec les bibliothèques Boost (version 1.52.0). Étant donné le code suivant:

#define ATTR_SET ".<xmlattr>"
#define XML_PATH1 "./pets.xml"

#include <iostream>
#include <string>
#include <boost/foreach.hpp>
#include <boost/property_tree/ptree.hpp>
#include <boost/property_tree/xml_parser.hpp>

using namespace std;
using namespace boost;
using namespace boost::property_tree;

const ptree& empty_ptree(){
    static ptree t;
    return t;
}

int main() {
    ptree tree;
    read_xml(XML_PATH1, tree);
    const ptree & formats = tree.get_child("pets", empty_ptree());
    BOOST_FOREACH(const ptree::value_type & f, formats){
        string at = f.first + ATTR_SET;
        const ptree & attributes = formats.get_child(at, empty_ptree());
        cout << "Extracting attributes from " << at << ":" << endl;
        BOOST_FOREACH(const ptree::value_type &v, attributes){
            cout << "First: " << v.first.data() << " Second: " << v.second.data() << endl;
        }
    }
}

Disons que j'ai la structure XML suivante:

<?xml version="1.0" encoding="utf-8"?>
<pets>
    <cat name="Garfield" weight="4Kg">
        <somestuff/>
    </cat>
    <dog name="Milu" weight="7Kg">
        <somestuff/>
    </dog>
    <bird name="Tweety" weight="0.1Kg">
        <somestuff/>
    </bird>
</pets>

Par conséquent, la sortie de la console, je vais obtenir sera le suivant:

Extracting attributes from cat.<xmlattr>:
First: name Second: Garfield
First: weight Second: 4Kg
Extracting attributes from dog.<xmlattr>:
First: name Second: Milu
First: weight Second: 7Kg
Extracting attributes from bird.<xmlattr>:
First: name Second: Tweety
First: weight Second: 0.1Kg

Cependant, si je décide d'utiliser une structure commune pour chaque élément établissant à partir du nœud racine (afin de les identifier à partir de leurs attributs spécifiques), le résultat va complètement changer. Cela peut être le fichier XML dans un tel cas:

<?xml version="1.0" encoding="utf-8"?>
<pets>
    <pet type="cat" name="Garfield" weight="4Kg">
        <somestuff/>
    </pet>
    <pet type="dog" name="Milu" weight="7Kg">
        <somestuff/>
    </pet>
    <pet type="bird" name="Tweety" weight="0.1Kg">
        <somestuff/>
    </pet>
</pets>

Et le résultat serait le suivant:

Extracting attributes from pet.<xmlattr>:
First: type Second: cat
First: name Second: Garfield
First: weight Second: 4Kg
Extracting attributes from pet.<xmlattr>:
First: type Second: cat
First: name Second: Garfield
First: weight Second: 4Kg
Extracting attributes from pet.<xmlattr>:
First: type Second: cat
First: name Second: Garfield
First: weight Second: 4Kg

Il semble que le nombre d'éléments suspendus à partir du nœud racine est correctement reconnu depuis trois ensembles d'attributs ont été imprimés. Néanmoins, tous se réfèrent aux attributs de l'élément premier...

Je ne suis pas un expert en C++ et de vraiment nouveau à Boost, donc cela pourrait être quelque chose qui m'échappe à l'égard de hachage de cartographie de traitement ou alors... Tous les conseils seront très appréciés.

source d'informationauteur grover999