Altova MapForce 2025 Professional Edition

Après avoir généré du code depuis le schéma d’exemple, une application C++ test est créée, avec plusieurs bibliothèques Altova de support.

 

À propos des bibliothèques C++ générées

La classe centrale du code généré est la classe CDoc qui représente le document XML. Une telle classe est générée pour tous les schémas et son nom dépend du nom de fichier de schéma. Comme indiqué dans le diagramme, cette classe fournit des méthodes pour charger les documents depuis des fichiers, des streams binaires ou des strings (ou pour enregistrer des documents dans des fichiers, des streams, des strings). Pour consulter une liste de tous les membres exposés par cette classe, voir la référence de classe ( [YourSchema]::[CDoc] ).

cg_cpp_example_01

Le champ Library de la classe CDoc représente la racine réelle du document. Library est un élément dans le fichier XML, donc dans le code C++ il a une classe de modèle en tant que type (MemberElement). Le modèle de classe expose des méthodes et des propriétés pour interagir avec l’élément Library . En général, chaque attribut et chaque élément d’un type dans le schéma est saisi dans le code généré avec les classes de modèle MemberAttribute et MemberElement, respectivement. Pour plus d'informations, voir la référence de classe [YourSchema]::MemberAttribute et [YourSchema]::MemberElement .

 

La classe CLibraryType est générée depuis le type complexe LibraryType dans le schéma. Veuillez noter que la classe CLibraryType contient deux champs : Book et LastUpdated. Conformément à la logique déjà mentionnée ci-dessus, ces champs correspondent à l’élément Book et à l’attribut LastUpdated dans le schéma, et vous permettent de manipuler par le biais d’un programme (apposer, supprimer, etc.) des éléments et des attributs dans le document d’instance XML.

cg_cpp_example_02

Puisque le DictionaryType est un type complexe dérivé depuis BookType dans le schéma, cette relation se retrouve aussi dans les classes générées. Comme illustré dans le diagramme, la classe CDictionaryType hérite la classe CBookType.

cg_cpp_example_03

Si votre schéma XML définit des types simples en tant qu’énumérations, les valeurs énumérées deviennent disponibles en tant que valeurs enum dans le code généré. Dans le schéma utilisé dans ces exemple, un format de livre peut être hardcover, paperback, e-book, etc. Dans le code généré, ces valeurs peuvent donc être disponibles via un enum membre de la classe CBookFormatType.

 

Écrire un document XML

1.Ouvrir la solution LibraryTest.sln dans Visual Studio générée depuis le schéma Library mentionné plus tôt dans cet exemple.

 

Tout en prototypant une application depuis un schéma XML changeant fréquemment, vous devrez éventuellement générer fréquemment du code dans le même répertoire, de manière à ce que les changements de schéma sont réfléchis immédiatement dans le code. Veuillez noter que l’application de test généré et les bibliothèques Altova sont écrasées à chaque fois que vous générez du code dans le même répertoire cible. C’est pourquoi il ne faut pas ajouter du code à l’application de test généré. Au lieu de cela, veuillez intégrer les bibliothèques dans votre projet (voir Intégrer des Bibliothèques Schema Wrapper).

 

2.Dans Solution Explorer, ouvrir le fichier LibraryTest.cpp, et éditer la méthode Example() comme indiqué ci-dessous.

 

#include <ctime> // required to get current time
using namespace Doc; // required to work with Altova libraries
 
void Example()
{
  // Create a new, empty XML document
  CDoc libDoc = CDoc::CreateDocument();
 
  // Create the root element <Library> and add it to the document
  CLibraryType lib = libDoc.Library.append();
 
  // Get current time and set the "LastUpdated" attribute using Altova classes
  time_t t = time(NULL);  
  struct tm * now = localtime( & t );
  altova::DateTime dt = altova::DateTime(now->tm_year + 1900, now->tm_mon + 1, now->tm_mday, now->tm_hour, now->tm_min, now->tm_sec);
  lib.LastUpdated = dt;
 
  // Create a new <Book> and add it to the library
  CBookType book = lib.Book.append();
 
  // Set the "ID" attribute of the book
  book.ID = 1;
 
  // Set the "Format" attribute of the <Book> using an enumeration constant
  book.Format.SetEnumerationValue( CBookFormatType::k_Paperback );
 
  // Add the <Title> and <Author> elements, and set values
  book.Title.append() = _T("The XML Spy Handbook");
  book.Author.append() = _T("Altova");
 
  // Append a dictionary (book of derived type) and populate its attributes and elements
  CDictionaryType dictionary = CDictionaryType(lib.Book.append().GetNode());
  dictionary.ID = 2;
  dictionary.Format.SetEnumerationValue( CBookFormatType::k_E_book);
  dictionary.Title.append() = _T("English-German Dictionary");
  dictionary.Author.append() = _T("John Doe");
  dictionary.FromLang.append() = _T("English");
  dictionary.ToLang.append() = _T("German");
 
  // Since dictionary a derived type, set the xsi:type attribute of the book element
  dictionary.SetXsiType();
 
  // Optionally, set the schema location
  libDoc.SetSchemaLocation(_T("Library.xsd"));
 
  // Save the XML document to a file with default encoding (UTF-8),
  // "true" causes the file to be pretty-printed.
  libDoc.SaveToFile(_T("GeneratedLibrary.xml"), true);
 
  // Destroy the document
  libDoc.DestroyDocument();
}

 

3.Appuyer sur F5 pour lancer le débogage. Si le code a été exécuté avec succès, un fichier GeneratedLibrary.xml est créé dans le répertoire de sortie de solution.

 

Lire un document XML

1.Ouvrir la solution LibraryTest.sln dans Visual Studio.

2.Enregistrer le code ci-dessous en tant que Library1.xml dans un répertoire qui peut être lu par le code de programme (par exemple, le même répertoire que LibraryTest.sln).

 

<?xml version="1.0" encoding="utf-8"?>
<Library xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://www.nanonull.com/LibrarySample" xsi:schemaLocation="http://www.nanonull.com/LibrarySample Library.xsd" LastUpdated="2016-02-03T17:10:08.4977404">
<Book ID="1" Format="E-book">
<Title>The XMLSpy Handbook</Title>
<Author>Altova</Author>
</Book>
<Book ID="2" Format="Paperback" xmlns:n1="http://www.nanonull.com/LibrarySample" xsi:type="n1:DictionaryType">
<Title>English-German Dictionary</Title>
<Author>John Doe</Author>
<FromLang>English</FromLang>
<ToLang>German</ToLang>
</Book>
</Library>

 

3.Dans Solution Explorer, ouvrir le fichier LibraryTest.cpp, et éditer la méthode Example() comme indiqué ci-dessous.

 

using namespace Doc;
void Example()
{
  // Load XML document
  CDoc libDoc = CDoc::LoadFromFile(_T("Library1.xml"));
 
  // Get the first (and only) root element <Library>
  CLibraryType lib = libDoc.Library.first();
 
  // Check whether an element exists:
  if (!lib.Book.exists())
  {
    tcout << "This library is empty." << std::endl;
    return;
  }
 
  // iteration: for each <Book>...
  for (Iterator<CBookType> itBook = lib.Book.all(); itBook; ++itBook)
  {
    // output values of ISBN attribute and (first and only) title element
    tcout << "ID: " << itBook->ID << std::endl;
    tcout << "Title: " << tstring(itBook->Title.first()) << std::endl;
     
    // read and compare an enumeration value
    if (itBook->Format.GetEnumerationValue() == CBookFormatType::k_Paperback)
        tcout << "This is a paperback book." << std::endl;
     
    // for each <Author>...
    for (CBookType::Author::iterator itAuthor = itBook->Author.all(); itAuthor; ++itAuthor)
        tcout << "Author: " << tstring(itAuthor) << std::endl;
     
    // alternative: use count and index
    for (unsigned int j = 0; j < itBook->Author.count(); ++j)
        tcout << "Author: " << tstring(itBook->Author[j]) << std::endl;
  }
 
  // Destroy the document
  libDoc.DestroyDocument();
}

 

4.Press F5 to start debugging.

© 2018-2024 Altova GmbH