web-dev-qa-db-fra.com

Lecture, écriture, fichier XML en C++

J'ai beaucoup cherché sur la façon de lire et d'écrire (mettre à jour) un simple fichier .xml en C++, mais je ne suis pas en mesure de développer le code correspondant.

Je travaille et ai installé la bibliothèque xerces-c qui, à mon avis, est nécessaire pour utiliser DOM ou SAX2 pour le lire.

S'il vous plaît, quelqu'un peut vous aider à écrire le code correspondant.

Un exemple de code pour ce faire sera très utile.

Merci et meilleures salutations, Adarsh ​​Sharma

9
Adarsh Sharma

Je recommande MSXML. Cela peut sembler compliqué, mais c'est agréable et facile quand on s'y habitue.
Voici un exemple:

input.xml:

<?xml version="1.0" encoding="UTF-8"?>
<Car>
    <Wheels>
        <Wheel1>FL</Wheel1>
        <Wheel2>FR</Wheel2>
        <Wheel3>RL</Wheel3>
        <Wheel4>RR</Wheel4>
    </Wheels>
</Car>

code:

#include <stdio.h>
#include <tchar.h>
#include <windows.h>
#import <msxml6.dll> rename_namespace(_T("MSXML"))

int main(int argc, char* argv[]) {
    HRESULT hr = CoInitialize(NULL); 
    if (SUCCEEDED(hr)) {
        try {
            MSXML::IXMLDOMDocument2Ptr xmlDoc;
            hr = xmlDoc.CreateInstance(__uuidof(MSXML::DOMDocument60),
                                       NULL, CLSCTX_INPROC_SERVER);
            // TODO: if (FAILED(hr))...

            if (xmlDoc->load(_T("input.xml")) != VARIANT_TRUE) {
                printf("Unable to load input.xml\n");
            } else {
                printf("XML was successfully loaded\n");

                xmlDoc->setProperty("SelectionLanguage", "XPath");
                MSXML::IXMLDOMNodeListPtr wheels = xmlDoc->selectNodes("/Car/Wheels/*");
                printf("Car has %u wheels\n", wheels->Getlength());

                MSXML::IXMLDOMNodePtr node;
                node = xmlDoc->createNode(MSXML::NODE_ELEMENT, _T("Engine"), _T(""));
                node->text = _T("Engine 1.0");
                xmlDoc->documentElement->appendChild(node);
                hr = xmlDoc->save(_T("output.xml"));
                if (SUCCEEDED(hr))
                    printf("output.xml successfully saved\n");
            }
        } catch (_com_error &e) {
            printf("ERROR: %ws\n", e.ErrorMessage());
        }
        CoUninitialize();
    }
    return 0;
}

sortie: XML chargé avec succès La voiture a 4 roues sortie.xml enregistrée avec succès

output.xml:

<?xml version="1.0" encoding="UTF-8"?>
<Car>
    <Wheels>
        <WheelLF>1</WheelLF>
        <WheelRF>2</WheelRF>
        <WheelLR>3</WheelLR>
        <WheelRR>4</WheelRR>
    </Wheels>
    <Engine>Engine 1.0</Engine></Car>

Vous trouverez tout ce dont vous avez besoin ici:
http://msdn.Microsoft.com/en-us/library/ms765540(v=vs.85).aspx

J'espère que quelqu'un trouve cela utile;)

18
LihO

Le sérialiseur Boost peut faire l'affaire, si vous lui passez un objet, il écrit un fichier (binaire ou xml ou même un simple fichier texte) avec toutes les propriétés de la classe.

0
JosephITA