Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
2682 connectés 

  FORUM HardWare.fr
  Programmation
  C++

  Libxml++ : find and dynamic_cast

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Libxml++ : find and dynamic_cast

n°1763231
ekra
Posté le 22-07-2008 à 15:32:31  profilanswer
 

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
mood
Publicité
Posté le 22-07-2008 à 15:32:31  profilanswer
 

n°1766501
ekra
Posté le 29-07-2008 à 18:11:16  profilanswer
 

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
n°1766602
Joel F
Real men use unique_ptr
Posté le 30-07-2008 à 07:05:08  profilanswer
 

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

n°1767472
ekra
Posté le 31-07-2008 à 20:14:25  profilanswer
 

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
n°1767474
Joel F
Real men use unique_ptr
Posté le 31-07-2008 à 20:26:29  profilanswer
 

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.

n°1767501
Taz
bisounours-codeur
Posté le 31-07-2008 à 21:23:07  profilanswer
 

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.

n°1767963
ekra
Posté le 01-08-2008 à 16:54:56  profilanswer
 

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

Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C++

  Libxml++ : find and dynamic_cast

 

Sujets relatifs
find date avec vbaMS-DOS : Boucle For, IF et Find imbriqués, probleme d'affectation
Batch findSegmentation fault et make pointer from interger without a cast
[C#] Erreur de cast !!petite question sur l'héritage et les cast
[Ant] faire un équivalent de find / sed avec Ant[VBA / sendkeys / ie / find] sendkeys VBA pour internet explorer
Assignment makes pointer from integer without a cast...probleme table de hachage dans requete find
Plus de sujets relatifs à : Libxml++ : find and dynamic_cast


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR