IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

XML Discussion :

[Libxml2] node et children


Sujet :

XML

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    331
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 331
    Par défaut [Libxml2] node et children
    la fonction me permet de charger un document XML et d'effectuer une opération XPath, afin de récupérer les attributs d'un noeud.
    Elle renvoie le résultat sous forme de structure (tTransmission).

    J'aimerai savoir comme récupérer les éléments enfants (children) et leurs attributs.

    struct tTransmission GetTransmission(char *id)
    {
    char *global_cfgfile; // fichier de configuration
    tTransmission transmission; // transmission
    char * attValue=NULL; // permet la récupération des attributs

    // Génération de l'expression XPath pour noeud "get" en fonction de l'@id "trans"
    char *XPathExp;
    XPathExp = "//trans[@id=";
    strcat(XPathExp, id);
    strcat(XPathExp, "]/get");

    //printf("%s\n",XPathExp);

    int returnValue = 0;

    // Initialisation et déclaration variables XML
    xmlDoc *doc = NULL;
    xmlXPathContextPtr xpathCtx = NULL;
    xmlXPathObjectPtr xpathObj = NULL;

    // Récupération chemin du fichier de config
    if ((global_cfgfile = getenv(HOSADUPLIC_CFG)) == NULL) {
    printf("error : HOSADUPLIC_CFG\n");
    returnValue = -1;
    goto end;
    }

    // chargement du fichier de configuration
    doc = xmlReadFile(global_cfgfile, NULL, 0);
    if (doc == NULL) {
    printf("error: could not parse file %s\n", global_cfgfile);
    returnValue = -1;
    goto end;
    }

    // création du context XPath et évaluation de l'expression
    xpathCtx = xmlXPathNewContext(doc);
    xpathObj = xmlXPathEvalExpression(reinterpret_cast<xmlChar*>(XPathExp), xpathCtx);

    attValue = (char *) xmlGetProp(xpathObj->nodesetval->nodeTab[0],(xmlChar *) "type");

    transmission.id = id;
    transmission.source.type = attValue;

    end:
    // on libére et on nettoie
    xmlXPathFreeObject(xpathObj);
    xmlXPathFreeContext(xpathCtx);
    xmlFreeDoc(doc);
    xmlCleanupParser();

    return transmission;

    }

  2. #2
    Expert confirmé

    Avatar de fearyourself
    Homme Profil pro
    Ingénieur Informaticien Senior
    Inscrit en
    Décembre 2005
    Messages
    5 121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur Informaticien Senior
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5 121
    Par défaut
    Question pas claire, sommes-nous des devins?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    xpathObj = xmlXPathEvalExpression(reinterpret_cast<xmlChar*>(XPathExp), xpathCtx);
    Pas du C...


    Sans une bonne question plus spécifique ce sera difficile de faire mieux comme réponse,

    Jc

  3. #3
    Membre Expert Avatar de gnto
    Homme Profil pro
    Ingénieur système logiciel
    Inscrit en
    Janvier 2006
    Messages
    923
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Ingénieur système logiciel
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Janvier 2006
    Messages : 923
    Par défaut
    as-tu consulter le site de libxml2 de gnome
    example
    documentation

  4. #4
    Membre éclairé
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    331
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 331
    Par défaut
    Oui, j'ai lu et relu la documentation et les exemples, ce qui m'a permis de faire un bout de chemin, à savoir récupérer un node.
    Maintenant, comment peut-on faire pour récuperer les noeuds enfants (et leurs attributs) de ce node ?

    Je ne trouve pas de réponse clair dans les documentations...


    Sans une bonne question plus spécifique ce sera difficile de faire mieux comme réponse
    Je ne comprends pas ce que tu veux dire par là. Peux-tu être plus explicit ?

  5. #5
    Membre Expert
    Avatar de Gruik
    Profil pro
    Développeur Web
    Inscrit en
    Juillet 2003
    Messages
    1 566
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Juillet 2003
    Messages : 1 566
    Par défaut
    Salut, je suis moi aussi en train de me prendre la tete avec libxml et xpath
    Je pense qu'il te faut acceder directement aux champs des structures
    Donc si tu veux les elements enfant d'un element, il faudrait lire le champ children du xmlNode
    http://www.xmlsoft.org/libxml-tree.html#xmlNode

  6. #6
    Membre éclairé
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    331
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 331
    Par défaut
    Justement, là réside mon problème

    Comment fait-on pour le lire ?

    J'ai pour l'instant fait cela :

    cur_node = myNode->children;

    while((cur_node = cur_node->next) && (find==0))
    {
    if ((cur_node->type == XML_ELEMENT_NODE)) {
    value = (char *)cur_node->name;
    find=1;
    if(strcmp(value,"wmq")==0)
    {
    transmission.source.type = value;

    attValue = (char *) xmlGetProp(cur_node,(xmlChar *) "machine");
    transmission.source.wmq.machine = attValue;

    attValue = (char *) xmlGetProp(cur_node,(xmlChar *) "queueManager");
    transmission.source.wmq.qManager = attValue;

    attValue = (char *) xmlGetProp(cur_node,(xmlChar *) "queue");
    transmission.source.wmq.queue = attValue;

    attValue = (char *) xmlGetProp(cur_node,(xmlChar *) "canal");
    transmission.source.wmq.canal = attValue;

    }

    }
    }
    Globalement, je parcours mes children et je cherche le bon pour récupérer les informations qui m'interessent...
    Ceci dit, on est bien loin du selectSingleNode que l'on a dans le XMLDom de Microsoft

Discussions similaires

  1. [VB6] Treeview: nombre de node?
    Par gg78 dans le forum VB 6 et antérieur
    Réponses: 3
    Dernier message: 02/11/2004, 10h42
  2. Colorer le texte d'une node d'un treeView
    Par SBP dans le forum MFC
    Réponses: 3
    Dernier message: 28/10/2004, 19h34
  3. selection nodes
    Par luta_seb dans le forum XSL/XSLT/XPATH
    Réponses: 2
    Dernier message: 28/09/2004, 16h47
  4. []générer et LIRE du xml avec vb: sélection d'un node
    Par chris21 dans le forum VB 6 et antérieur
    Réponses: 11
    Dernier message: 19/09/2003, 13h14
  5. template match="node() mais pas text()"
    Par Manu_Just dans le forum XSL/XSLT/XPATH
    Réponses: 4
    Dernier message: 26/03/2003, 10h52

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo