Учебники

Groovy — XML

XML — это переносимый язык с открытым исходным кодом, который позволяет программистам разрабатывать приложения, которые могут быть прочитаны другими приложениями, независимо от операционной системы и / или языка разработки. Это один из самых распространенных языков, используемых для обмена данными между приложениями.

Что такое XML?

Расширяемый язык разметки XML — это язык разметки, очень похожий на HTML или SGML. Это рекомендуется Консорциумом World Wide Web и доступно в качестве открытого стандарта. XML чрезвычайно полезен для отслеживания небольших и средних объемов данных без использования магистрали на основе SQL.

Поддержка XML в Groovy

Язык Groovy также обеспечивает богатую поддержку языка XML. Два самых основных используемых класса XML:

  • XML Markup Builder — Groovy поддерживает генератор разметки на основе дерева, BuilderSupport, который можно разделить на подклассы для создания различных представлений объектов с древовидной структурой. Обычно эти компоновщики используются для представления разметки XML, разметки HTML. Генератор разметки Groovy ловит вызовы псевдометодов и преобразует их в элементы или узлы древовидной структуры. Параметры этих псевдометодов рассматриваются как атрибуты узлов. Замыкания как часть вызова метода рассматриваются как вложенный подконтент для результирующего узла дерева.

  • Анализатор XML. Класс Groovy XmlParser использует простую модель для анализа XML-документа в дереве экземпляров Node. Каждый узел имеет имя элемента XML, атрибуты элемента и ссылки на любые дочерние узлы. Этой модели достаточно для самой простой обработки XML.

XML Markup Builder — Groovy поддерживает генератор разметки на основе дерева, BuilderSupport, который можно разделить на подклассы для создания различных представлений объектов с древовидной структурой. Обычно эти компоновщики используются для представления разметки XML, разметки HTML. Генератор разметки Groovy ловит вызовы псевдометодов и преобразует их в элементы или узлы древовидной структуры. Параметры этих псевдометодов рассматриваются как атрибуты узлов. Замыкания как часть вызова метода рассматриваются как вложенный подконтент для результирующего узла дерева.

Анализатор XML. Класс Groovy XmlParser использует простую модель для анализа XML-документа в дереве экземпляров Node. Каждый узел имеет имя элемента XML, атрибуты элемента и ссылки на любые дочерние узлы. Этой модели достаточно для самой простой обработки XML.

Для всех наших примеров XML-кода давайте используем следующий простой XML-файл movies.xml для создания XML-файла и последующего чтения файла.

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

XML Markup Builder

Синтаксис

public MarkupBuilder()

MarkupBuilder используется для создания всего документа XML. Документ XML создается вначале путем создания объекта класса документа XML. Как только объект создан, может быть вызван псевдометод для создания различных элементов XML-документа.

Давайте рассмотрим пример того, как создать один блок, то есть один элемент фильма из приведенного выше XML-документа.

Live Demo

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

В приведенном выше примере необходимо отметить следующее:

  • mB.collection () — это генератор разметки, который создает XML-тег head для <collection> </ collection>

  • movie (title: ‘Enemy Behind’) — Эти псевдометоды создают дочерние теги с помощью этого метода, создавая тег со значением. Указывая значение с названием title, это фактически означает, что для элемента должен быть создан атрибут.

  • Псевдометоду предоставляется замыкание для создания оставшихся элементов документа XML.

  • Конструктор по умолчанию для класса MarkupBuilder инициализируется таким образом, чтобы сгенерированный XML был передан в стандартный поток вывода.

mB.collection () — это генератор разметки, который создает XML-тег head для <collection> </ collection>

movie (title: ‘Enemy Behind’) — Эти псевдометоды создают дочерние теги с помощью этого метода, создавая тег со значением. Указывая значение с названием title, это фактически означает, что для элемента должен быть создан атрибут.

Псевдометоду предоставляется замыкание для создания оставшихся элементов документа XML.

Конструктор по умолчанию для класса MarkupBuilder инициализируется таким образом, чтобы сгенерированный XML был передан в стандартный поток вывода.

Когда мы запустим вышеуказанную программу, мы получим следующий результат —

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

Чтобы создать весь XML-документ, необходимо сделать следующее.

  • Запись карты должна быть создана для хранения различных значений элементов.
  • Для каждого элемента карты мы присваиваем значение каждому элементу.

Live Demo

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

Когда мы запустим вышеуказанную программу, мы получим следующий результат —

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

Синтаксический анализ XML

Класс Groovy XmlParser использует простую модель для анализа XML-документа в дереве экземпляров Node. Каждый узел имеет имя элемента XML, атрибуты элемента и ссылки на любые дочерние узлы. Этой модели достаточно для самой простой обработки XML.

Синтаксис

public XmlParser() 
   throws ParserConfigurationException, 
      SAXException

В следующем коде показан пример использования синтаксического анализатора XML для чтения XML-документа.

Давайте предположим, что у нас есть тот же документ с именем Movies.xml, и мы хотели проанализировать XML-документ и отобразить правильный вывод для пользователя. Следующий код представляет собой фрагмент того, как мы можем просмотреть весь контент XML-документа и отобразить правильный ответ пользователю.

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

Когда мы запустим вышеуказанную программу, мы получим следующий результат —

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

Важные вещи, чтобы отметить о приведенном выше коде.

  • Объект класса XmlParser формируется таким образом, чтобы его можно было использовать для анализа XML-документа.

  • Синтаксическому анализатору задается местоположение файла XML.

  • Для каждого элемента фильма мы используем замыкание для просмотра каждого дочернего узла и отображения соответствующей информации.

Объект класса XmlParser формируется таким образом, чтобы его можно было использовать для анализа XML-документа.

Синтаксическому анализатору задается местоположение файла XML.

Для каждого элемента фильма мы используем замыкание для просмотра каждого дочернего узла и отображения соответствующей информации.

Для самого элемента movie мы используем символ @ для отображения атрибута title, прикрепленного к элементу movie.