XML是一種便攜的開放源代碼語言,允許程序員開發(fā)可以被其他應用程序讀取的應用程序,而不管操作系統(tǒng)和/或開發(fā)語言。這是用于在應用程序之間交換數(shù)據(jù)的最常用的語言之一。
可擴展標記語言XML是一種非常類似于HTML或SGML的標記語言。這是萬維網(wǎng)聯(lián)盟推薦的,可作為開放標準。XML對于跟蹤少量到中等數(shù)據(jù)量而不需要基于SQL的骨干非常有用。
Groovy語言還提供了對XML語言的豐富支持。使用的兩個最基本的XML類是 -
XML標記構建器 - Groovy支持基于樹的標記生成器BuilderSupport,它可以被子類化以生成各種樹結(jié)構對象表示。通常,這些構建器用于表示XML標記,HTML標記。 Groovy的標記生成器捕獲對偽方法的調(diào)用,并將它們轉(zhuǎn)換為樹結(jié)構的元素或節(jié)點。這些偽方法的參數(shù)被視為節(jié)點的屬性。作為方法調(diào)用一部分的閉包被視為生成的樹節(jié)點的嵌套子內(nèi)容。
XML解析器 - Groovy XmlParser類使用一個簡單的模型來將XML文檔解析為Node實例的樹。每個節(jié)點都有XML元素的名稱,元素的屬性和對任何子節(jié)點的引用。這個模型足夠用于大多數(shù)簡單的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>
public MarkupBuilder()
MarkupBuilder用于構造整個XML文檔。通過首先創(chuàng)建XML文檔類的對象來創(chuàng)建XML文檔。一旦創(chuàng)建了對象,可以調(diào)用偽方法來創(chuàng)建XML文檔的各種元素。
讓我們來看一個如何創(chuàng)建一個塊的示例,即從上述XML文檔中創(chuàng)建一個電影元素 -
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() -這是一個標記生成器,用于創(chuàng)建<collection> </ collection>的頭XML標簽
movie(title : 'Enemy Behind') -這些偽方法使用此方法創(chuàng)建帶有值的標記的子標記。通過指定一個名為title的值,這實際上表示需要為該元素創(chuàng)建一個屬性。
向偽方法提供閉包以創(chuàng)建XML文檔的剩余元素。
初始化類MarkupBuilder的默認構造函數(shù),以便將生成的XML發(fā)布到標準輸出流
當我們運行上面的程序,我們將得到以下結(jié)果 -
<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>
為了創(chuàng)建整個XML文檔,需要執(zhí)行以下操作。
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]) } } } } }
當我們運行上面的程序,我們將得到以下結(jié)果 -
<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>
Groovy XmlParser類使用一個簡單的模型來將XML文檔解析為Node實例的樹。每個節(jié)點都有XML元素的名稱,元素的屬性和對任何子節(jié)點的引用。這個模型足夠用于大多數(shù)簡單的XML處理。
public XmlParser() throws ParserConfigurationException, SAXException
以下代碼顯示了如何使用XML解析器讀取XML文檔的示例。
讓我們假設我們有同樣的文檔,名為Movies.xml,我們想解析XML文檔并向用戶顯示一個正確的輸出。以下代碼是我們?nèi)绾伪闅vXML文檔的整個內(nèi)容并向用戶顯示正確響應的代碼段。
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("*******************************") } } }
當我們運行上面的程序,我們將得到以下結(jié)果 -
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文件的位置。
對于每個電影元素,我們使用閉包瀏覽每個子節(jié)點并顯示相關信息。
對于movie元素本身,我們使用@符號顯示附加到movie元素的title屬性。
更多建議: