Groovy - XML

XML est un langage portable et open source qui permet aux programmeurs de développer des applications qui peuvent être lues par d'autres applications, quel que soit le système d'exploitation et / ou le langage de développement. C'est l'un des langages les plus couramment utilisés pour l'échange de données entre applications.

Qu'est-ce que XML?

Le langage XML du langage de balisage extensible est un langage de balisage semblable au HTML ou au SGML. Ceci est recommandé par le World Wide Web Consortium et disponible en tant que norme ouverte. XML est extrêmement utile pour garder une trace de petites et moyennes quantités de données sans avoir besoin d'un backbone basé sur SQL.

Prise en charge XML dans Groovy

Le langage Groovy fournit également un support riche du langage XML. Les deux classes XML les plus basiques utilisées sont -

  • XML Markup Builder- Groovy prend en charge un générateur de balisage basé sur une arborescence, BuilderSupport, qui peut être sous-classé pour créer une variété de représentations d'objets structurés en arborescence. Généralement, ces générateurs sont utilisés pour représenter le balisage XML, le balisage HTML. Le générateur de balisage de Groovy détecte les appels à des pseudométries et les convertit en éléments ou nœuds d'une structure arborescente. Les paramètres de ces pseudo-méthodes sont traités comme des attributs des nœuds. Les fermetures faisant partie de l'appel de méthode sont considérées comme un sous-contenu imbriqué pour le nœud d'arbre résultant.

  • XML Parser- La classe Groovy XmlParser utilise un modèle simple pour analyser un document XML dans une arborescence d'instances Node. Chaque nœud a le nom de l'élément XML, les attributs de l'élément et des références à tous les nœuds enfants. Ce modèle est suffisant pour la plupart des traitements XML simples.

Pour tous nos exemples de code XML, utilisons le simple fichier XML movies.xml pour la construction du fichier XML et la lecture du fichier par la suite.

<collection shelf = "New Arrivals"> 

   <movie title = "Enemy Behind"> 
      <type>War, Thriller</type> 
      <format>DVD</format> 
      <year>2003</year> 
      <rating>PG</rating> 
      <stars>10</stars> 
      <description>Talk about a US-Japan war</description> 
   </movie> 
	
   <movie title = "Transformers"> 
      <type>Anime, Science Fiction</type>
      <format>DVD</format> 
      <year>1989</year> 
      <rating>R</rating> 
      <stars>8</stars> 
      <description>A schientific fiction</description> 
   </movie> 
	
   <movie title = "Trigun"> 
      <type>Anime, Action</type> 
      <format>DVD</format> 
      <year>1986</year> 
      <rating>PG</rating> 
      <stars>10</stars> 
      <description>Vash the Stam pede!</description> 
   </movie> 
	
   <movie title = "Ishtar"> 
      <type>Comedy</type> 
      <format>VHS</format> 
      <year>1987</year> 
      <rating>PG</rating> 
      <stars>2</stars> 
      <description>Viewable boredom </description> 
   </movie> 
	
</collection>

Générateur de balisage XML

Syntaxe

public MarkupBuilder()

Le MarkupBuilder est utilisé pour construire l'ensemble du document XML. Le document XML est créé en créant d'abord un objet de la classe de document XML. Une fois l'objet créé, une pseudo-méthode peut être appelée pour créer les différents éléments du document XML.

Regardons un exemple de la façon de créer un bloc, c'est-à-dire un élément de film à partir du document XML ci-dessus -

import groovy.xml.MarkupBuilder 

class Example {
   static void main(String[] args) {
      def mB = new MarkupBuilder()
		
      // Compose the builder
      mB.collection(shelf : 'New Arrivals') {
         movie(title : 'Enemy Behind')
         type('War, Thriller')
         format('DVD')
         year('2003')
         rating('PG')
         stars(10)
         description('Talk about a US-Japan war') 
      }
   } 
}

Dans l'exemple ci-dessus, les choses suivantes doivent être notées -

  • mB.collection() - Ceci est un générateur de balisage qui crée la balise XML head de <collection> </collection>

  • movie(title : 'Enemy Behind')- Ces pseudo-méthodes créent les balises enfants avec cette méthode créant la balise avec la valeur. En spécifiant une valeur appelée title, cela indique en fait qu'un attribut doit être créé pour l'élément.

  • Une fermeture est fournie à la pseudo-méthode pour créer les éléments restants du document XML.

  • Le constructeur par défaut de la classe MarkupBuilder est initialisé afin que le XML généré soit émis vers le flux de sortie standard

Lorsque nous exécutons le programme ci-dessus, nous obtiendrons le résultat suivant -

<collection shelf = 'New Arrivals'> 
   <movie title = 'Enemy Behind' /> 
      <type>War, Thriller</type> 
      <format>DVD</format> 
      <year>2003</year> 
      <rating>PG</rating> 
      <stars>10</stars> 
      <description>Talk about a US-Japan war</description> 
   </movie> 
</collection>

Afin de créer l'intégralité du document XML, les opérations suivantes doivent être effectuées.

  • Une entrée de carte doit être créée pour stocker les différentes valeurs des éléments.
  • Pour chaque élément de la carte, nous attribuons la valeur à chaque élément.
import groovy.xml.MarkupBuilder 

class Example {
   static void main(String[] args) {
      def mp = [1 : ['Enemy Behind', 'War, Thriller','DVD','2003', 
         'PG', '10','Talk about a US-Japan war'],
         2 : ['Transformers','Anime, Science Fiction','DVD','1989', 
         'R', '8','A scientific fiction'],
         3 : ['Trigun','Anime, Action','DVD','1986', 
         'PG', '10','Vash the Stam pede'],
         4 : ['Ishtar','Comedy','VHS','1987', 'PG', 
         '2','Viewable boredom ']] 
			
      def mB = new MarkupBuilder()  
		
      // Compose the builder
      def MOVIEDB = mB.collection('shelf': 'New Arrivals') {
         mp.each {
            sd -> 
            mB.movie('title': sd.value[0]) {  
               type(sd.value[1])
               format(sd.value[2])
               year(sd.value[3]) 
               rating(sd.value[4])
               stars(sd.value[4]) 
               description(sd.value[5]) 
            }
         }
      }
   } 
}

Lorsque nous exécutons le programme ci-dessus, nous obtiendrons le résultat suivant -

<collection shelf = 'New Arrivals'> 
   <movie title = 'Enemy Behind'> 
      <type>War, Thriller</type> 
      <format>DVD</format> 
      <year>2003</year> 
      <rating>PG</rating> 
      <stars>PG</stars> 
      <description>10</description> 
   </movie> 
   <movie title = 'Transformers'> 
      <type>Anime, Science Fiction</type> 
      <format>DVD</format> 
      <year>1989</year>
	  <rating>R</rating> 
      <stars>R</stars> 
      <description>8</description> 
   </movie> 
   <movie title = 'Trigun'> 
      <type>Anime, Action</type> 
      <format>DVD</format> 
      <year>1986</year> 
      <rating>PG</rating> 
      <stars>PG</stars> 
      <description>10</description> 
   </movie> 
   <movie title = 'Ishtar'> 
      <type>Comedy</type> 
      <format>VHS</format> 
      <year>1987</year> 
      <rating>PG</rating> 
      <stars>PG</stars> 
      <description>2</description> 
   </movie> 
</collection>

Analyse XML

La classe Groovy XmlParser utilise un modèle simple pour analyser un document XML dans une arborescence d'instances Node. Chaque nœud a le nom de l'élément XML, les attributs de l'élément et des références à tous les nœuds enfants. Ce modèle est suffisant pour la plupart des traitements XML simples.

Syntaxe

public XmlParser() 
   throws ParserConfigurationException, 
      SAXException

Le code suivant montre un exemple de la façon dont l'analyseur XML peut être utilisé pour lire un document XML.

Supposons que nous ayons le même document appelé Movies.xml et que nous voulions analyser le document XML et afficher une sortie appropriée à l'utilisateur. Le code suivant est un extrait de la façon dont nous pouvons parcourir tout le contenu du document XML et afficher une réponse appropriée à l'utilisateur.

import groovy.xml.MarkupBuilder 
import groovy.util.*

class Example {

   static void main(String[] args) { 
	
      def parser = new XmlParser()
      def doc = parser.parse("D:\\Movies.xml");
		
      doc.movie.each{
         bk->
         print("Movie Name:")
         println "${bk['@title']}"
			
         print("Movie Type:")
         println "${bk.type[0].text()}"
			
         print("Movie Format:")
         println "${bk.format[0].text()}"
			
         print("Movie year:")
         println "${bk.year[0].text()}"
			
         print("Movie rating:")
         println "${bk.rating[0].text()}"
			
         print("Movie stars:")
         println "${bk.stars[0].text()}"
			
         print("Movie description:")
         println "${bk.description[0].text()}"
         println("*******************************")
      }
   }
}

Lorsque nous exécutons le programme ci-dessus, nous obtiendrons le résultat suivant -

Movie Name:Enemy Behind 
Movie Type:War, Thriller 
Movie Format:DVD 
Movie year:2003 
Movie rating:PG 
Movie stars:10 
Movie description:Talk about a US-Japan war 
******************************* 
Movie Name:Transformers 
Movie Type:Anime, Science Fiction 
Movie Format:DVD 
Movie year:1989 
Movie rating:R 
Movie stars:8 
Movie description:A schientific fiction 
******************************* 
Movie Name:Trigun 
Movie Type:Anime, Action
Movie Format:DVD 
Movie year:1986 
Movie rating:PG 
Movie stars:10 
Movie description:Vash the Stam pede! 
******************************* 
Movie Name:Ishtar 
Movie Type:Comedy 
Movie Format:VHS 
Movie year:1987 
Movie rating:PG 
Movie stars:2 
Movie description:Viewable boredom

Les choses importantes à noter sur le code ci-dessus.

  • Un objet de la classe XmlParser est en cours de formation afin de pouvoir être utilisé pour analyser le document XML.

  • L'analyseur reçoit l'emplacement du fichier XML.

  • Pour chaque élément de film, nous utilisons une fermeture pour parcourir chaque nœud enfant et afficher les informations pertinentes.

Pour l'élément movie lui-même, nous utilisons le symbole @ pour afficher l'attribut title attaché à l'élément movie.