7
votes

Comment obtenir des attributs d'un nœud à libxml2

Je travaille sur un analyseur pour obtenir des données à partir d'un fichier XML. J'utilise libxml2 pour extraire des données. Je ne suis pas capable d'obtenir les attributs des nœuds. Je n'ai trouvé que nb_attributes pour obtenir le nombre d'attributs.


0 commentaires

6 Réponses :


1
votes

Essayez quelque chose comme:

xmlNodePtr node; // Some node
NSMutableArray *attributes = [NSMutableArray array];

for(xmlAttrPtr attribute = node->properties; attribute != NULL; attribute = attribute->next){
    xmlChar *content = xmlNodeListGetString(node->doc, attribute->children, YES);
    [attributes addObject:[NSString stringWithUTF8String:content]];
    xmlFree(content);
}


3 commentaires

Salut mat. J'ai trouvé votre code utile pour trouver les valeurs de l'attribut. Mais cela donne la valeur pour seul le premier nœud. Comment obtenir des valeurs pour les nœuds suivants également. ??.. Merci d'avance.


Ne devrait pas nœud-enfants devenir attribut-> enfants ?


Oui, cela devrait également voir @matthew Lowe, il a remarqué l'erreur plus tôt. J'ai mis à jour la réponse (2,5 ans plus tard;))



13
votes

Je pense que Joostk signifiait attribut-> enfants, donnant quelque chose comme ceci: xxx

Voir si cela fonctionne pour vous.


2 commentaires

Salut mat. J'ai trouvé votre code utile pour trouver les valeurs de l'attribut. Mais cela donne la valeur pour seul le premier nœud. Comment obtenir des valeurs pour les nœuds suivants également. ??.. Merci d'avance.


Vous pouvez itérer sur des nœuds de la même manière que vous ithétéral sur les attributs: nœud = nœud-> Suivant.



9
votes

Si vous voulez juste un attribut unique, utilisez xmlgetProp ou xmlgetnsprop


0 commentaires

3
votes

Je pense que j'ai trouvé pourquoi vous n'avez que 1 attribut (au moins cela m'est arrivé).

Le problème était que je lisais des attributs pour le premier nœud, mais suivant est un nœud texte. Je ne sais pas pourquoi, mais nœud-> Propriétés me donne une référence à une partie non lisible de la mémoire, donc il s'est écrasé.

Ma solution consistait à vérifier le type de nœud (élément est 1)

J'utilise un lecteur, donc: xxx

Le code entier Vous pouvez l'obtenir de http://www.xmlsoft.org/examples/reader1.c.c et ajoutez ceci xxx

à la ligne 50.


0 commentaires

0
votes

Si vous utilisez la méthode SAX StartElementns (...), cette fonction est ce que vous recherchez: xxx

utilisation: xxx < / p>


0 commentaires

0
votes

Le moyen le plus simple que j'ai trouvé à l'aide de libxml2 (via LibxML ++ en C ++) consistait à utiliser les méthodes eval_to_xxx code>. Ils évaluent une expression XPath, vous devez donc utiliser la syntaxe @property code>.

Par exemple: p>

std::string get_property(xmlpp::Node *const &node) {
    return node->eval_to_string("@property")
}


1 commentaires

La voie la plus efficace et directe avec libxml ++ est retour std :: string (dynamic_cast (noeud) -> get_attribute_value ("propriété")) . En outre, votre déclaration de paramètre est bizarre: vous déclarez noeud comme référence à un pointeur de const à non-const xmlpp :: noeud . Plus utile serait: const xmlpp :: nœud * noeud