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
Vous devez vous connecter pour publier un commentaire.
Le problème avec votre programme est situé dans cette ligne:
Avec cette ligne, vous vous demandez pour amener l'enfant
pet.<xmlattr>
depets
et vous faites cela 3 fois de façon indépendante de celuif
vous traversez. Suivant cet article je suppose que ce que vous devez utiliser est:Le code complet, qui fonctionne à la fois avec vos fichiers xml, est:
Sans jamais utiliser cette fonctionnalité pour l'instant, je dirais qu'
boost::property_tree
analyseur XML n'est pas une commune de XML, mais s'attend à un certain schéma, où vous avez exactement une balise spécifique pour une propriété spécifique.Vous préférerez peut-être utiliser d'autres parseurs XML qui fournit une analyse des schémas XML, si vous voulez travailler avec XML au-delà de la
boost::property_tree
capacités. Regardez par exemple Xerces C++ ou Poco XML.