Groovy - XML

XML è un linguaggio portatile e open source che consente ai programmatori di sviluppare applicazioni che possono essere lette da altre applicazioni, indipendentemente dal sistema operativo e / o dal linguaggio di sviluppo. Questa è una delle lingue più comuni utilizzate per lo scambio di dati tra le applicazioni.

Cos'è l'XML?

L'Extensible Markup Language XML è un linguaggio di markup molto simile a HTML o SGML. Questo è consigliato dal World Wide Web Consortium e disponibile come standard aperto. XML è estremamente utile per tenere traccia di piccole e medie quantità di dati senza richiedere un backbone basato su SQL.

Supporto XML in Groovy

Il linguaggio Groovy fornisce anche un ricco supporto del linguaggio XML. Le due classi XML più basilari utilizzate sono:

  • XML Markup Builder- Groovy supporta un generatore di markup basato su albero, BuilderSupport, che può essere sottoclasse per creare una varietà di rappresentazioni di oggetti strutturati ad albero. Comunemente, questi builder vengono utilizzati per rappresentare markup XML, markup HTML. Il generatore di markup di Groovy cattura le chiamate a pseudometodi e le converte in elementi o nodi di una struttura ad albero. I parametri di questi pseudometodi vengono trattati come attributi dei nodi. Le chiusure come parte della chiamata al metodo sono considerate come contenuto secondario annidato per il nodo della struttura ad albero risultante.

  • XML Parser- La classe Groovy XmlParser utilizza un semplice modello per analizzare un documento XML in un albero di istanze di Node. Ogni nodo ha il nome dell'elemento XML, gli attributi dell'elemento e riferimenti a qualsiasi nodo figlio. Questo modello è sufficiente per l'elaborazione XML più semplice.

Per tutti i nostri esempi di codice XML, utilizziamo il seguente semplice file XML movies.xml per la costruzione del file XML e la successiva lettura del file.

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

Generatore di markup XML

Sintassi

public MarkupBuilder()

MarkupBuilder viene utilizzato per costruire l'intero documento XML. Il documento XML viene creato creando prima un oggetto della classe del documento XML. Una volta creato l'oggetto, è possibile chiamare uno pseudometodo per creare i vari elementi del documento XML.

Diamo un'occhiata a un esempio di come creare un blocco, cioè un elemento del film dal documento XML sopra -

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') 
      }
   } 
}

Nell'esempio sopra, è necessario notare quanto segue:

  • mB.collection() - Questo è un generatore di markup che crea il tag XML head di <collection> </collection>

  • movie(title : 'Enemy Behind')- Questi pseudometodi creano i tag figlio con questo metodo creando il tag con il valore. Specificando un valore chiamato titolo, ciò indica effettivamente che è necessario creare un attributo per l'elemento.

  • Viene fornita una chiusura allo pseudometodo per creare gli elementi rimanenti del documento XML.

  • Il costruttore predefinito per la classe MarkupBuilder viene inizializzato in modo che l'XML generato venga emesso nel flusso di output standard

Quando eseguiamo il programma sopra, otterremo il seguente risultato:

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

Per creare l'intero documento XML, è necessario eseguire le seguenti operazioni.

  • È necessario creare una voce di mappa per memorizzare i diversi valori degli elementi.
  • Per ogni elemento della mappa, stiamo assegnando il valore a ciascun elemento.
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]) 
            }
         }
      }
   } 
}

Quando eseguiamo il programma sopra, otterremo il seguente risultato:

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

Analisi XML

La classe Groovy XmlParser utilizza un semplice modello per analizzare un documento XML in un albero di istanze di Node. Ogni nodo ha il nome dell'elemento XML, gli attributi dell'elemento e riferimenti a qualsiasi nodo figlio. Questo modello è sufficiente per l'elaborazione XML più semplice.

Sintassi

public XmlParser() 
   throws ParserConfigurationException, 
      SAXException

Il codice seguente mostra un esempio di come il parser XML può essere utilizzato per leggere un documento XML.

Supponiamo di avere lo stesso documento chiamato Movies.xml e di voler analizzare il documento XML e visualizzare un output appropriato per l'utente. Il codice seguente è un frammento di come possiamo attraversare l'intero contenuto del documento XML e visualizzare una risposta adeguata all'utente.

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("*******************************")
      }
   }
}

Quando eseguiamo il programma sopra, otterremo il seguente risultato:

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

Le cose importanti da notare sul codice sopra.

  • Si sta formando un oggetto della classe XmlParser in modo che possa essere utilizzato per analizzare il documento XML.

  • Al parser viene assegnata la posizione del file XML.

  • Per ogni elemento del film, utilizziamo una chiusura per navigare in ogni nodo figlio e visualizzare le informazioni pertinenti.

Per l'elemento movie stesso, stiamo usando il simbolo @ per visualizzare l'attributo title allegato all'elemento movie.