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 :

[MSXML6] Insertion de nœud


Sujet :

XML

  1. #1
    Membre régulier Avatar de gijy
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    136
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2005
    Messages : 136
    Points : 83
    Points
    83
    Par défaut [MSXML6] Insertion de nœud
    Bonsoir

    j'ecrit actuellement une application en MFC qui utilise un fichier de parametre au format XML.
    La lecture et les querry fonctionnent correctement, mais je bute sur l'insertion de noeud dans IXMLDOMDocument
    ci joint un petit bout de code d'exemple qui me sert de test

    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
     
    	// je cree un nouveau noeud
    	hr = pXMLDom->createNode(varType,bstrNodeValue,bstrTemp,&pNodeAdd);
    	//j'ecrit quelques choses dedans
    	SysReAllocString(&bstrTemp,L"essai");
    	pNodeAdd->put_text(bstrTemp);
    	pNodeAdd->get_nodeName(&bstrNodeName);
    	pNodeAdd->get_text(&bstrNodeName);
    	// je verife que mon est correctement ecrit
    	pNodeAdd->get_xml(&bstrNodeValue);
     
        // je prend le 2 noeuds d'une liste 
    	CHK_HR(pNodes->get_item(2, &pNode));
        CHK_HR(pNode->get_nodeName(&bstrNodeName));
     
    	CComVariant varRef;
    	varRef = pNodes;
    // tout va bien jusqu'ici
    	hr = pXMLDom->insertBefore(pNodeAdd,varRef,&pNodeReturn);
    //mais !! hr = E_INVALIDARG
    les parametres passés semble correctent, j'ai bien mon pointeur pNodeAdd, le pointeur de pointeur pNodeReturn est initialisé à NULL, mais rien ni fait....
    je n'ai plus d'idées, ni d'aspirine d'ailleurs

  2. #2
    Membre régulier Avatar de gijy
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    136
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2005
    Messages : 136
    Points : 83
    Points
    83
    Par défaut
    bonjour,

    ça été une vraie galere, la bibli msxml6 est tres mal documentée sur avec l'utilisation DOM obligatoire dans le cadre d'une appli win32 en c++ MFC.

    mais vous trouverez ci dessous la solution qui passe par 2 appels de query selectSingleNode.

    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
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
     
    // Helper function to create a DOM instance. 
    HRESULT CreateAndInitDOM(IXMLDOMDocument **ppDoc)
    {
        HRESULT hr = CoCreateInstance(__uuidof(DOMDocument60), NULL, CLSCTX_INPROC_SERVER, IID_PPV_ARGS(ppDoc));
        if (SUCCEEDED(hr))
        {
            // these methods should not fail so don't inspect result
            (*ppDoc)->put_async(VARIANT_FALSE);  
            (*ppDoc)->put_validateOnParse(VARIANT_FALSE);
            (*ppDoc)->put_resolveExternals(VARIANT_FALSE);
            (*ppDoc)->put_preserveWhiteSpace(VARIANT_TRUE);
        }
        return hr;
    }
    void queryNodes()
    {
        HRESULT hr = S_OK;
        IXMLDOMDocument *pXMLDom = NULL;
        IXMLDOMNodeList *pNodes = NULL;
        IXMLDOMNode *pNode = NULL;
    	IXMLDOMNode *pNodeOrigin = NULL;
    	IXMLDOMNode *pNodeAdd = NULL;
    	IXMLDOMNode *pNodeReturn = NULL;
    	IXMLDOMParseError *pXMLErr = NULL;
    	IXMLDOMElement *pXMLElement = NULL;
     
    	BSTR bstrQuery1 = NULL;
        BSTR bstrQuery2 = NULL;
        BSTR bstrNodeName = NULL;
        BSTR bstrNodeValue = NULL;
    	BSTR bstrTemp = NULL;
    	BSTR bstrXML = NULL;
    	BSTR bstrErr = NULL;
     
        VARIANT_BOOL varStatus;
        VARIANT varFileName;
    	VARIANT varTemp;
     
        VariantInit(&varFileName);
    	VariantInit(&varTemp);
     
        CHK_HR(CreateAndInitDOM(&pXMLDom)); // creation de l'instance
    	CHK_HR(VariantFromString(L"settingrtest.xml", varFileName));
        hr = pXMLDom->load(varFileName, &varStatus); // chargement du fichier xml
     
    	if (varStatus != VARIANT_TRUE)
        {
            CHK_HR(ReportParseError(pXMLDom, "Failed to load DOM from stocks.xml."));
        }
     
        // Query a single node.
        bstrQuery1 = SysAllocString(L"//bras[1]");
        CHK_ALLOC(bstrQuery1);
    	// recuper l'adresse du noeud parent
        hr = pXMLDom->selectSingleNode(bstrQuery1, &pNodeOrigin);
        if (pNodeOrigin)
        {
            printf("Result from selectSingleNode:\n");
            CHK_HR(pNodeOrigin->get_nodeName(&bstrNodeName));
            printf("Node, <%S>:\n", bstrNodeName);
            SysFreeString(bstrNodeName);
     
            CHK_HR(pNodeOrigin->get_xml(&bstrNodeValue));
            printf("\t%S\n\n", bstrNodeValue);
            SysFreeString(bstrNodeValue);
            SAFE_RELEASE(pNode);
        }
        else
        {
            CHK_HR(ReportParseError(pXMLDom, "Error while calling selectSingleNode."));
        }
     
    	bstrQuery1 = SysAllocString(L"//bras[1]/mouvement[2]");
        CHK_ALLOC(bstrQuery1);
        // recupere l'adresse du noeud ou je veux faire mon insertion
    	hr = pXMLDom->selectSingleNode(bstrQuery1, &pNode);
        if (pNode)
        {
            printf("Result from selectSingleNode:\n");
            CHK_HR(pNode->get_nodeName(&bstrNodeName));
            printf("Node, <%S>:\n", bstrNodeName);
            SysFreeString(bstrNodeName);
     
            CHK_HR(pNode->get_xml(&bstrNodeValue));
            printf("\t%S\n\n", bstrNodeValue);
            SysFreeString(bstrNodeValue);
            //SAFE_RELEASE(pNode);
        }
     
     
    	DOMNodeType type;
    	VARIANT varType;
    	// creation du noeud à inserer
    	SysReAllocString(&bstrNodeValue,L"nouveaunode");	
    	varType.vt = VT_I2;
    	varType.iVal = NODE_ELEMENT;
    	bstrTemp = SysAllocString(L"");
    	CHK_ALLOC(bstrTemp);
    	hr = pXMLDom->createNode(varType,bstrNodeValue,bstrTemp,&pNodeAdd);
    	SysReAllocString(&bstrTemp,L"essai");
    	pNodeAdd->put_text(bstrTemp);
    	pNodeAdd->get_nodeName(&bstrNodeName);
    	pNodeAdd->get_text(&bstrNodeName);
    	pNodeAdd->get_xml(&bstrNodeValue);
     
    	CComVariant varRef;
    	varRef = pNode;
    	// insertion	
    	hr = pNodeOrigin->insertBefore(pNodeAdd,varRef,&pNodeReturn);
    	sauvegarde
    	CHK_HR(pXMLDom->save(varFileName));
     
    }
    je joint en piece le fichier xml aussi ça peut aider quelqu'un
    Voilà! je remercie aussi mon pharmacien pour les aspirines
    Fichiers attachés Fichiers attachés

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

Discussions similaires

  1. [DOM] [Xerces] Insertion d'une entité
    Par Traroth dans le forum Format d'échange (XML, JSON...)
    Réponses: 10
    Dernier message: 19/05/2008, 09h28
  2. Bulk insert et caractère accentué
    Par slc dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 22/04/2003, 12h52
  3. probleme d'insertion d'un Float
    Par neness dans le forum Débuter
    Réponses: 3
    Dernier message: 07/01/2003, 12h32
  4. [Postgresql] pb lors d'insertion de données
    Par bob20000 dans le forum Requêtes
    Réponses: 8
    Dernier message: 04/11/2002, 15h33
  5. Réponses: 4
    Dernier message: 28/09/2002, 00h00

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