Exemple : Lire des documents XML (Java)
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].
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.
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 { |
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"?> |
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 { |
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 |
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 |
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 |
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 |
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 |
Vous pouvez lire ces valeurs d’énumération provenent de documents d’instance XML comme suit :
// read an enumeration value |
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 |
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 |
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 |
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 |