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

XSL/XSLT/XPATH XML Discussion :

[C++]Unsigned long/Parser XML


Sujet :

XSL/XSLT/XPATH XML

  1. #1
    Membre confirmé
    Inscrit en
    Mars 2010
    Messages
    62
    Détails du profil
    Informations personnelles :
    Âge : 36

    Informations forums :
    Inscription : Mars 2010
    Messages : 62
    Par défaut [C++]Unsigned long/Parser XML
    Bonjour a tous,

    Voila j'explique: j'ai installé la librairie libxml2. Que j'utilise en C++.
    Et je veux parser un fichier XML et récuperer des informations.
    J'ai créé un fichier XML.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    <ParamEcu>
    	<ECUTR2Info>
    		<EcuName>TR2</EcuName>
    		<AdresseEmmission>0xCDA04F9</AdresseEmmission>
    		<AdresseReception>0xCDAF904</AdresseReception>
    		<SeedValue>2F89</SeedValue>
    	</ECUTR2Info>
    	<ECUTR3Info>
    		<EcuName>TR3</EcuName>
    		<AdresseEmmission>0xCDA09F9</AdresseEmmission>
    		<AdresseReception> 0xCDAF909</AdresseReception>
    		<SeedValue>2F89</SeedValue>
    	</ECUTR3Info>
    	<ECUSFAInfo>
    		<EcuName>SFA</EcuName>
    		<AdresseEmmission>0xCDA15F9</AdresseEmmission>
    		<AdresseReception>0xCDAF915</AdresseReception>
    		<SeedValue>2DAB</SeedValue>
    	</ECUSFAInfo>
    </ParamEcu>
    Enfaite ce que je veux c'est récuperer a chaque fois les information EcuName, AdresseEmmission et AdresseReception en format unsigned long. Car la fonction qui utilisera ces paramètres es veux en unsigned long. Et ça je ne peux le changer.

    J'ai fait ceci dans mon code c++:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    unsigned long CalculateurXML::getAdresseReception()
    {
       	// Initialisation de l'environnement XPath
    	xmlXPathInit();
    	xmlDocPtr doc;
    	int j=0;
    	xmlChar *pxpathEcuAdresseReception;
    	//Chemin des informations dans le XML TR2
    	if (ptrCRecuperation_CalculateursDlg->calculo == TR2)
    	{
    		pxpathEcuAdresseReception = (xmlChar*) "/ParamEcu/ECUTR2Info/AdresseReception/text()";
    	}
    	//Chemin des informations dans le XML TR3
    	else if (ptrCRecuperation_CalculateursDlg->calculo == TR3)
    	{
    		pxpathEcuAdresseReception = (xmlChar*) "/ParamEcu/ECUTR3Info/AdresseReception/text()";
    	}
    	//Chemin des informations dans le XML SFA
    	else if (ptrCRecuperation_CalculateursDlg->calculo == SFA)
    	{
    		pxpathEcuAdresseReception = (xmlChar*) "/ParamEcu/ECUSFAInfo/AdresseReception/text()";
    	}
    	xmlXPathObjectPtr xpathRes; 
    	int i;
     
    	// Ouverture du fichier XML
        doc = xmlParseFile("ECU.xml");
        if (doc == NULL) 
    	{
            fprintf(stderr, "Document XML invalide\n");
            //return EXIT_FAILURE;
        }
    
    	// Création du contexte
    	xmlXPathContextPtr ctxt = xmlXPathNewContext(doc); // doc est un xmlDocPtr 
    	if (ctxt == NULL) 
    	{
    		fprintf(stderr, "Erreur lors de la création du contexte XPath\n");
    		xmlFreeDoc(doc); 
    		exit(-1);
    	}
    
    
    		// Evaluation de l'expression XPath
    		xpathRes = xmlXPathEvalExpression(pxpathEcuAdresseReception, ctxt);
    		if (xpathRes == NULL) 
    		{
    			fprintf(stderr, "Erreur sur l'expression XPath\n");
    			exit(-1);
    		}
    
    		// Manipulation du résultat
    		if (xpathRes->type == XPATH_NODESET) 
    		{
    			for (i = 0; i < xpathRes->nodesetval->nodeNr; i++) 
    			{
    				//n noeud dans lequel on est
    				xmlNodePtr n = xpathRes->nodesetval->nodeTab[i];
    				if (n->type == XML_TEXT_NODE || n->type == XML_CDATA_SECTION_NODE) 
    				{
    					AdresseReception=(unsigned long)n->content;
    				}
    			}
    		}
    
    	// Libération de la mémoire
    	xmlXPathFreeObject(xpathRes);
    	xmlXPathFreeContext(ctxt);
    	xmlFreeDoc(doc);
    	return AdresseReception;
    }
    A cette ligne ci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    AdresseReception=(unsigned long)n->content;
    Je cast en unsigned long pour que ça seraccorde avec ma fonction, le problème c'est que ça change ma valeur.
    Dans ma fonction j'ai besoin exactement de:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    fonction(0xCDA09F9); //(par exemple)
    Et ici je fait:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    CalculateurXML xpath;
    fonction(Xpath.getAdresseEmmission());
    Et ça ne fonctionne pas a cause du cast qui memodifi ma valeure.

    Je ne sais pas si vous avez compris, si je susi assezclair en toutcsa je ne sais pas si l'erreur vient de mon fichier xml ou du C++...

    Merci en tout cas de m'avoir lu.

  2. #2
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 582
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 582
    Par défaut
    Quand tu parses un document XML, tu n'as que des balises et du texte. Les nombres, ça n'existe pas.

    0xCDAF904 est du texte, pas un nombre, pas une adresse. C'est la chaîne const char* s = "0xCDAF904";

    Évidemment, si tu cast ça en unsigned long, ça va donner l'adresse du const char*, ça ne va pas donner l'adresse que représente son contenu.

    Solution : prendre la chaîne donnée par le XML, virer le "0x" devant, et parser le reste comme un nombre hexadécimal.
    Ce n'est pas le job de libxml, tu dois le faire avec la bibliothèque C++ standard.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  3. #3
    Membre confirmé
    Inscrit en
    Mars 2010
    Messages
    62
    Détails du profil
    Informations personnelles :
    Âge : 36

    Informations forums :
    Inscription : Mars 2010
    Messages : 62
    Par défaut
    Merci beaucoup pour votre réponse!

    Je ne savais pas du tout tout ce que vous m'avez dit c'est la première fois que j'écris un doc xml et parse un fichier.

    Que ce soit clair si je parser mon fichier avec du CDA.. J'aurais de l'hexadécimal?

    Merci encore.

    Je vais de suite me mettre a trouver la solution.

    Bonne journée a vous.

  4. #4
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 582
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 582
    Par défaut
    Citation Envoyé par LiaGalanodel Voir le message
    Que ce soit clair si je parser mon fichier avec du CDA.. J'aurais de l'hexadécimal?
    C'est quoi, "parser un fichier avec du CDA" ?
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  5. #5
    Membre confirmé
    Inscrit en
    Mars 2010
    Messages
    62
    Détails du profil
    Informations personnelles :
    Âge : 36

    Informations forums :
    Inscription : Mars 2010
    Messages : 62
    Par défaut
    Je m'exprime mal je susi désolé mais j'ai compris enfaite en récupérant les donnée de mon fichier xml je vais récuperer une chaine de caractère ce sera donc a moi de faire que la chaine de caractère devienne un hexadécimal compréhensible par ma fonction.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [XML] Parser XML
    Par RobinJulie dans le forum C++Builder
    Réponses: 2
    Dernier message: 03/02/2005, 08h48
  2. Parser XML -> PDF
    Par ebaynaud dans le forum Modules
    Réponses: 2
    Dernier message: 12/10/2004, 14h07
  3. [SAX] NoSuchElementException sur parser XML
    Par iceman dans le forum Format d'échange (XML, JSON...)
    Réponses: 5
    Dernier message: 17/05/2004, 14h42
  4. parser xml
    Par billout dans le forum C++Builder
    Réponses: 4
    Dernier message: 20/11/2003, 11h08
  5. Parser XML
    Par miloux32 dans le forum XML/XSL et SOAP
    Réponses: 4
    Dernier message: 18/07/2003, 03h17

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