Libxml++ : find and dynamic_cast

Libxml++ : find and dynamic_cast - C++ - Programmation

Marsh Posté le 22-07-2008 à 15:32:31    

Bonjour a tous,
 
Je cherche à caster un xmlpp::Node en xmlpp::TextNode à la suite d'un find() mais je n'y arrive pas !
 

Code :
  1. int main() {
  2.   xmlpp::DomParser dp;
  3.   dp.set_substitute_entities();
  4.   dp.parse_file("xml.xml" );
  5.   xmlpp::Node* rn = dp.get_document()->get_root_node();
  6.   xmlpp::NodeSet ns = rn->find("personne/prenom" );
  7.   xmlpp::NodeSet::const_iterator it;
  8.   for (it=ns.begin();it!=ns.end();it++) {
  9.     cout << (*it)->get_name() << endl;
  10.     if ((dynamic_cast<const xmlpp::ContentNode*>(*it)) == 0) {
  11.       cout << "Dynamic cast failed" << endl ;
  12.     }
  13.   }
  14. }


A l'execution, il affiche alors "Dynamic cast failed".
J'ai l'impression que libXMLpp n'instancie que des xmlpp::Node.
Je cherche simplement à retourner un text grâce à un XPath.
 
Info : libXML++-2.6
 
Merci d'avance.


Message édité par ekra le 22-07-2008 à 15:34:55
Reply

Marsh Posté le 22-07-2008 à 15:32:31   

Reply

Marsh Posté le 29-07-2008 à 18:11:16    

Finalement je m'en suis sorti !
En fait le find() ne renvoie pas un xmlpp::ContentNode mais un xmlpp::Element. On le dynamic_cast donc en xmlpp::Element et on the sert des méthodes getFirstChildText() pour récupérer le texte à l'intérieur.
 
Je ne trouve pas très logique cette façon de procéder, et ne comprends pas pourquoi on n'a pas pu caster directement en xmlpp::ContentNode mais cette solution fonctionne.
 
Salut !


Message édité par ekra le 31-07-2008 à 20:25:26
Reply

Marsh Posté le 30-07-2008 à 07:05:08    

tout simplement car ContentNode n'est pas une classe fille de Element.

Reply

Marsh Posté le 31-07-2008 à 20:14:25    

Oui merci Joel F. Je me suis mal exprimé. Je n'ai pas compris la modélisation. En quoi la recherche d'un noeud devrait retourner un Element et non un node castable en contentNode par la suite.


Message édité par ekra le 31-07-2008 à 20:24:28
Reply

Marsh Posté le 31-07-2008 à 20:26:29    

vah ca, faut regarder le rationale du truc. L'idée princiaple est certainement - à raison - de séparé la structure en arbre de son contenu.

Reply

Marsh Posté le 31-07-2008 à 21:23:07    

Joel F a écrit :

tout simplement car ContentNode n'est pas une classe fille de Element.


c'est UB dans ce cas là. Le dynamic_cast ça n'est pas magique, faut quand même faire gaffe à son utilisation.

Reply

Marsh Posté le 01-08-2008 à 16:54:56    

Node
  * ContentNode
  * Element
 

Taz a écrit :


c'est UB dans ce cas là. Le dynamic_cast ça n'est pas magique, faut quand même faire gaffe à son utilisation.


 
Merci je connais le dynamic_cast mais la documentation ne précise pas que (cf http://libxmlplusplus.sourceforge. [...] 1Node.html ) :
xmlpp::NodeSet xmlpp::Node::find(std::string path)
retourne un ensemble de xmlpp::Element et non xmlpp::Node comme on (ou je) pourrait le croire. Je l'ai dit plus haut.
Le problème est que je ne comprends pas pourquoi on pourrait avoir des éléments plutôt que des Nodes.  
Exemple : je cherche un node contenant du texte avec un XPath : le dynamic_cast me révèle que c'est un Element qui est instancié en résultat alors qu'on aurait pu croire que c'était un ContentNode.
Dans quels cas a-t-on un ContentNode ? Si ça n'arrive jamais pourquoi retourner un ensemble de Node (en réalité des Elements) plutot qu'un ensemble de Element ?


Message édité par ekra le 01-08-2008 à 17:12:33
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed