2010-08-12 7 views
2

J'utilise libxml2 et C++. La fonction suivante se bloque ici à return (char*)cur->content;. Quand je le change en return (char*)cur->name; alors il renverra attribute qui est le nom de l'étiquette. Ce que je veux est 1, 2 et 3 (basé sur le fichier XML ci-dessous le code C++). Qu'est-ce que je fais mal?Comment obtenir le contenu avec libxml2?

char* xml2sdf::getId(xmlNode* part){ 

    xmlNode* cur = part->xmlChildrenNode; 

    // get the id 
    while (cur != NULL) { 

     if (!xmlStrcmp(cur->name, (const xmlChar *)"attribute")) { 
      xmlAttrPtr attr = cur->properties; 

      if(!xmlStrcmp(attr->children->content, (const xmlChar*)"id")){ 
       return (char*)cur->content; 
      } 
     } 

     cur = cur->next; 
     } 

    } 
} 

La partie du fichier XML, il est l'analyse:

<part ref="part10" name="part10"> 
    <attribute name="face">7</attribute> 
    <attribute name="id">1</attribute> 
</part> 

<part ref="part20" name="part20"> 
    <attribute name="face">5</attribute> 
    <attribute name="id">2</attribute> 
</part> 

<part ref="part30" name="part30"> 
    <attribute name="face">9</attribute> 
    <attribute name="id">3</attribute> 
</part> 

Répondre

7

Je l'ai découvert devrait être return (char*)cur->children->content; par essais et erreurs.

+1

Le contenu d'un noeud est un enfant de ce noeud, c'est pourquoi vous devez d'abord accéder aux enfants. Vous pouvez également envisager d'utiliser la fonction xmlNodeGetContent au lieu d'accéder directement à la structure. C'est-à-dire, "return (char *) xmlNodeGetContent (cur-> children);". – Ishmael