Altova XMLSpy 2024 Enterprise Edition

Après avoir généré du code depuis le schéma de bibliothèque (voir Schéma d’exemple), un projet de text Java est créé, avec plusieurs bibliothèques Altova.

 

À propos des bibliothèques Java générées

La classe centrale du code généré est la classe Doc2 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. Veuillez noter que cette classe est appelée Doc2 pour éviter un conflit possible avec le nom d’espace de noms. 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 description de cette classe, voir la référence de classe com.[YourSchema].[Doc].

cg_java_classes_01

Le membre Library de la classe Doc2 représente la véritable racine du document.

 

Conformément aux règles de génération de code mentionnées dans À propos du code Java généré, les membres de classes sont générés pour chaque attribut et pour chaque élément d’un type. Dans le code généré, le nom de ce type de classes de membre est préfixé avec MemberAttribute_ et MemberElement_, respectivement. Dans le diagramme ci-dessus, des exemples de ce type de classes sont MemberAttribute_ID et MemberElement_Author, générés depuis l’élément Author et l’attribut ID d’un livre, respectivement. Ces classes vous permettent de manipuler à l’aide d’un programme les éléments et les attributs correspondants dans l’instance du document XML (par exemple, apposer, supprimer, définir une valeur, etc). Pour plus d'informations, voir la référence de classe com.[YourSchema].[YourSchemaType].MemberAttribute et com.[YourSchema].[YourSchemaType].MemberElement .

 

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 DictionaryType hérite la classe BookType.

cg_java_classes_02

Si votre schéma XML définit des types simples en tant qu’énumerations, 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 BookFormatType.

 

Écrire un document XML

1.Dans le menu Fichier d’Eclipse, cliquer sur Import, choisir Existing Projects into Workspace, et cliquer sur Next.

2.À côté de Select root directory, cliquer sur Browse, choisir le répertoire dans lequel vous souhaitez générer le code Java, et cliquer sur Finish.

3.Dans Eclipse Package Explorer, agrandir le package com.LibraryTest et ouvrir le fichier LibraryTest.java.

 

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).

 

4.Éditer la méthode Example() comme indiqué ci-dessous.

 

protected static void example() throws Exception {
    // create a new, empty XML document
    Doc2 libDoc = Doc2.createDocument();
 
    // create the root element <Library> and add it to the document
    LibraryType lib = libDoc.Library.append();
           
    // set the "LastUpdated" attribute
    com.altova.types.DateTime dt = new com.altova.types.DateTime(DateTime.now());
    lib.LastUpdated.setValue(dt);
 
    // create a new <Book> and populate its elements and attributes
    BookType book = lib.Book.append();      
    book.ID.setValue(java.math.BigInteger.valueOf(1));
    book.Format.setEnumerationValue( BookFormatType.EPAPERBACK );
    book.Title.append().setValue("The XML Spy Handbook");
    book.Author.append().setValue("Altova");
 
    // create a dictionary (book of derived type)  and populate its elements and attributes
    DictionaryType dict = new DictionaryType(lib.Book.append().getNode());
    dict.ID.setValue(java.math.BigInteger.valueOf(2));
    dict.Title.append().setValue("English-German Dictionary");
    dict.Format.setEnumerationValue(BookFormatType.EE_BOOK);
    dict.Author.append().setValue("John Doe");
    dict.FromLang.append().setValue("English");
    dict.ToLang.append().setValue("German");
    dict.setXsiType();        
           
    // set the schema location (this is optional)
    libDoc.setSchemaLocation("Library.xsd");
 
    // save the XML document to a file with default encoding (UTF-8). "true" causes the file to be pretty-printed.
    libDoc.saveToFile("Library1.xml", true);
}

 

5.Construire le projet Java et l’exécuter. Si le code a été exécuté avec succès, un fichier Library1.xml est créé dans le répertoire de projet.

 

Lire un document XML

1.Dans le menu Fichier d’Eclipse, cliquer sur Import, choisir Existing Projects into Workspace, et cliquer sur Next.

2.À côté de Select root directory, cliquer sur Browse, choisir le répertoire dans lequel vous souhaitez générer le code Java, et cliquer sur Finish.

3.Enregistrer le code ci-dessous en tant que Library1.xml dans un répertoire local (vous devrez vous référer au chemin du fichier Library1.xml depuis l’échantillon de code ci-dessous).

 

<?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>

 

4.Dans Eclipse Package Explorer, agrandir le package com.LibraryTest et ouvrir le fichier LibraryTest.java.

5.Éditer la méthode Example() comme indiqué ci-dessous.

 

protected static void example() throws Exception {
    // load XML document from a path, make sure to adjust the path as necessary
    Doc2 libDoc = Doc2.loadFromFile("Library1.xml");
 
    // get the first (and only) root element <Library>
    LibraryType lib = libDoc.Library.first();
 
    // check whether an element exists:
    if (!lib.Book.exists()) {
      System.out.println("This library is empty.");
      return;
    }
 
    // read a DateTime schema type
    com.altova.types.DateTime dt = lib.LastUpdated.getValue();
    System.out.println("The library was last updated on: " + dt.toDateString());
 
    // iteration: for each <Book>...
    for (java.util.Iterator itBook = lib.Book.iterator(); itBook.hasNext();) {
      BookType book = (BookType) itBook.next();
      // output values of ID attribute and (first and only) title element
      System.out.println("ID: " + book.ID.getValue());
      System.out.println("Title: " + book.Title.first().getValue());
 
      // read and compare an enumeration value
      if (book.Format.getEnumerationValue() == BookFormatType.EPAPERBACK)
          System.out.println("This is a paperback book.");
 
      // for each <Author>...
      for (java.util.Iterator itAuthor = book.Author.iterator(); itAuthor
            .hasNext();)
          System.out.println("Author: " + ((com.Doc.xs.stringType) itAuthor.next()).getValue());
 
      // find the derived type of this book
      // by looking at the value of the xsi:type attribute, using DOM      
      org.w3c.dom.Node bookNode = book.getNode();  
      if (bookNode.getAttributes().getNamedItem("xsi:type") != null) {
          // Get the value of the xsi:type attribute
          String xsiTypeValue = bookNode.getAttributes().getNamedItem("xsi:type").getNodeValue();
 
          // Get the namespace URI and lookup prefix of this namespace
          String namespaceUri = bookNode.getNamespaceURI();            
          String lookupPrefix = bookNode.lookupPrefix(namespaceUri);
 
          // If xsi:type matches the namespace URI and type of the book node
          if (namespaceUri == "http://www.nanonull.com/LibrarySample"
                && ( xsiTypeValue.equals(lookupPrefix + ":DictionaryType" )))   {
            // ...then this is a book of derived type (dictionary)              
            DictionaryType dictionary = new DictionaryType(   book.getNode());
            // output the value of the "FromLang" and "ToLang" elements
            System.out.println("From language: " + dictionary.FromLang.first().getValue());
            System.out.println("To language: " + dictionary.ToLang.first().getValue());
          }
          else
          {
            // throw an error
            throw new java.lang.Error("This book has an unknown type.");
          }
      }
    }
  }

 

6.Construire le projet Java et l’exécuter. Si le code est exécuté avec succès, Library1.xml sera lu par le code de programme, et ses contenus seront affichés dans le mode Console.

 

Lire et écrire des éléments et des attributs

Les valeurs des éléments et des attributs peut être accédé en utilisant la méthode getValue() de la classe d’élément ou d'attribut du membre généré, par exemple :

 

// output values of ID attribute and (first and only) title element
System.out.println("ID: " + book.ID.getValue());
System.out.println("Title: " + book.Title.first().getValue());

 

Pour obtenir la valeur de l’élément Title dans cet exemple particulier, nous avons aussi utilisé la méthode first(), étant donné que c’est le premier (et seul) élément Title d’un livre. Dans les cas où vous devez choisir un élément spécifique depuis une liste par index, utiliser la méthode at().

 

Pour itérer dans plusieurs éléments, utiliser soit une itération basée sur l’index ou java.util.Iterator. Par exemple, vous pouvez itérer dans les livres d’une bibliothèque comme suit :

 

// index-based iteration
for (int j = 0; j < lib.Book.count(); ++j ) {  
  // your code here
}
 
// alternative iteration using java.util.Iterator
for (java.util.Iterator itBook = lib.Book.iterator(); itBook.hasNext();) {      
    // your code here
  }

 

Pour ajouter un nouvel élément, utiliser la méthode Append(). Par exemple, le code suivant appose un élément de racine videLibrary dans le document :

 

// create the root element <Library> and add it to the document
LibraryType lib = libDoc.Library3.append();

 

Une fois qu’un élément est apposé, vous pouvez définir la valeur d’un de ses éléments ou un attribut en utilisant la méthode setValue().

 

// set the value of the Title element
book.Title.append().setValue("The XML Spy Handbook");
// set the value of the ID attribute
book.ID.setValue(java.math.BigInteger.valueOf(1));

 

Lire et écrire des valeurs d’énumération

Si votre schéma XML définit des types simples en tant qu’énumerations, 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 (voir le diagramme de classe BookFormatType ci-dessus). Pour attribuer des valeurs d’énumération à un objet, utiliser du code comme celui ci-dessous :

 

// set an enumeration value
book.Format.setEnumerationValue( BookFormatType.EPAPERBACK );

 

Vous pouvez lire ces valeurs d’énumération provenent de documents d’instance XML comme suit :

 

// read an enumeration value
if (book.Format.getEnumerationValue() == BookFormatType.EPAPERBACK)
System.out.println("This is a paperback book."

 

Si une condition "if" n’est pas suffisante, créer un interrupteur pour déterminer chaque valeur d’énumération et traiter comme requis.

 

Travailler avec des types xs:dateTime et xs:duration

Si le schéma à partir duquel vous avez généré du code utilise les types heure et durée comme xs:dateTime, ou xs:duration, ils sont convertis en classes natives Altova dans un code généré. C’est pourquoi, pour écrire une valeur date ou durée vers le document XML, procéder comme suit :

 

1.Construit un objet com.altova.types.DateTime ou com.altova.types.Duration .

2.Définir l’objet en tant que la valeur de l’élément ou de l’attribut requis, par exemple :

 

// set the value of an attribute of DateTime type
com.altova.types.DateTime dt = new com.altova.types.DateTime(DateTime.now());
lib.LastUpdated.setValue(dt);

 

Pour lire une date ou une durée depuis un document XML :

 

1.Déclarer la valeur d’élément (ou d’attribut) comme objet com.altova.types.DateTime ou com.altova.types.Duration .

2.Formate l’élément ou l’attribut requis, par exemple :

 

// read a DateTime type
com.altova.types.DateTime dt = lib.LastUpdated.getValue();
System.out.println("The library was last updated on: " + dt.toDateString());

 

Pour plus d'informations, voir la référence de classe com.altova.types.DateTime et com.altova.types.Duration .

 

Travailler avec des types dérivés

Si votre schéma XML définit des types dérivés, vous pouvez préserver la dérivation de type dans des documents XML que vous créez ou chargez par le biais d’un programme. Prendre le schéma utilisé dans cet exemple, l’extrait de code suivant illustre comment créer un nouveau livre de type dérivéDictionaryType:

 

// create a dictionary (book of derived type) and populate its elements and attributes
DictionaryType dict = new DictionaryType(lib.Book.append().getNode());
dict.ID.setValue(java.math.BigInteger.valueOf(2));
dict.Title.append().setValue("English-German Dictionary");
dict.Format.setEnumerationValue(BookFormatType.EE_BOOK);
dict.Author.append().setValue("John Doe");
dict.FromLang.append().setValue("English");
dict.ToLang.append().setValue("German");
dict.setXsiType();

 

Veuillez noter qu’il est important de définir l’attribut xsi:type du livre récemment créé. Cela garantit que le type de livre sera interprété correctement par le schéma losrque le document XML est validé.

 

Lorsque vous chargez des données depuis un document XML, l’extrait de code suivant montre comment identifier un livre de type dérivé DictionaryType dans l’instance XML chargée. Premièrement, le code trouve la valeur de l’attribut xsi:type du nœud de livre. Si l’espace de noms URI de ce nœud est http://www.nanonull.com/LibrarySample et si le préfixe et type de lookup URI correspond à la valeur de l’attribut xsi:type, alors il s’agit d’un dictionnaire :

 

        // find the derived type of this book
// by looking at the value of the xsi:type attribute, using DOM
org.w3c.dom.Node bookNode = book.getNode();
if (bookNode.getAttributes().getNamedItem("xsi:type") != null) {
// Get the value of the xsi:type attribute
String xsiTypeValue = bookNode.getAttributes().getNamedItem("xsi:type").getNodeValue();
 
// Get the namespace URI and lookup prefix of the book node
String namespaceUri = bookNode.getNamespaceURI();
String lookupPrefix = bookNode.lookupPrefix(namespaceUri);
 
// If xsi:type matches the namespace URI and type of the book node
if (namespaceUri == "http://www.nanonull.com/LibrarySample"
&& ( xsiTypeValue.equals(lookupPrefix + ":DictionaryType" ))) {
// ...then this is a book of derived type (dictionary)
DictionaryType dictionary = new DictionaryType( book.getNode());
// output the value of the "FromLang" and "ToLang" elements
System.out.println("From language: " + dictionary.FromLang.first().getValue());
System.out.println("To language: " + dictionary.ToLang.first().getValue());
}
else
{
// throw an error
throw new java.lang.Error("This book has an unknown type.");
}
}

© 2017-2023 Altova GmbH