8.XML
java中處理xml:使用的一般是dom文檔驅動處理或者sax事件驅動處理
groovy處理xml
:
-
8.1: groovy中如何解析xml :
使用XmlSlurper進行解析
final String xml = '''
<response version-api="2.0">
<value>
<books id="1" classification="android">
<book available="20" id="1">
<title>瘋狂Android講義<span class="hljs-name"title>
<author id="1">李剛<span class="hljs-name"author>
<span class="hljs-name"book>
<book available="14" id="2">
<title>第一行代碼<span class="hljs-name"title>
<author id="2">郭林<span class="hljs-name"author>
<span class="hljs-name"book>
<book available="13" id="3">
<title>Android開發藝術探索<span class="hljs-name"title>
<author id="3">任玉剛<span class="hljs-name"author>
<span class="hljs-name"book>
<book available="5" id="4">
<title>Android源碼設計模式<span class="hljs-name"title>
<author id="4">何紅輝<span class="hljs-name"author>
<span class="hljs-name"book>
<span class="hljs-name"books>
<books id="2" classification="web">
<book available="10" id="1">
<title>Vue從入門到精通<span class="hljs-name"title>
<author id="4">李剛<span class="hljs-name"author>
<span class="hljs-name"book>
<span class="hljs-name"books>
<span class="hljs-name"value>
<span class="hljs-name"response>
'''
//開始解析:XmlSlurper
def xmlSluper = new XmlSlurper()
def response = xmlSluper.parseText(xml)
println response.value.books[0].book[0].title
println response.value.books[1].book[0].@available
//xml遍歷:遍歷所有的李剛的書名
def list = []
response.value.books.each { books->
books.book.each { book ->
if(book.author == '李剛'){
list.add(book.title)
}
}
}
println list.toListString()
打印結果:
[瘋狂Android講義, Vue從入門到精通]
這里我們找到所有的李剛的書名
- 8.2:
xml節點遍歷
深度遍歷
:遍歷所有的李剛的書名
def depFirst = response.depthFirst().findAll { book ->
return book.author.text() == '李剛' ? true : false
}.collect { book ->
book.title
}
println depFirst.toListString()
打印結果:[瘋狂Android講義, Vue從入門到精通]
廣度遍歷
def name1 = response.value.books.children().findAll { node ->
node.name() =='book' && node.@id == '2'‘
}.collect { node ->
node.title
}
println name1
打印結果:[第一行代碼]
- 8.3:
groovy中如何創建一個xml
:使用MarkupBuilder
需求:生成xml格式數據
/**
* 生成xml格式數據
*
*/
//根據類動態生成xml文件
StringWriter sw = new StringWriter()
MarkupBuilder mb = new MarkupBuilder(sw)
Langs langs = new Langs(
type: 'current',count:3,mainstream:true,
languages: [
new Language(flavor: 'static',version:'1.5',value: 'Java'),
new Language(flavor: 'dynamic',version:'1.6.0',value: 'Groovy'),
new Language(flavor: 'dynamic',version:'1.9',value: 'JavaScript')
]
)
mb.langs(type: langs.type,count:langs.count,mainstream:langs.mainstream){
langs.languages.each { _lang ->
language(flavor:_lang.flavor,version:_lang.version,_lang.value)
}
}
println sw.toString()
saveFile(sw.toString(),'../../release.xml')
def saveFile(String source,String desFilePath){
try {
File desFile = new File(desFilePath)
if(!desFile.exists()){
desFile.createNewFile()
}
desFile.withWriter {
it.write(source)
}
return true
}catch(Exception e){
return false
}
}
class Langs {
String type
int count
boolean mainstream
def languages = []
}
class Language {
String flavor
String version
String value
}
查看文件release.xml
9.Groovy實戰:
下面我用一個Groovy實戰項目來總結前面所講的內容:
項目需求:從網絡上獲取當前版本信息,然后使用groovy腳本將獲取到的版本信息寫入到本地文件中
gradle項目實戰1.png
- 3.
添加OkHttp網絡請求庫
這里我們為了方便,使用了我們android中常用的網絡請求庫OkHttp
okhttp.png
- 4.
完整代碼
如下:
package var
import groovy.json.JsonOutput
import groovy.json.JsonSlurper
import groovy.xml.MarkupBuilder
import okhttp3.OkHttpClient
import okhttp3.Request
/**
* 生成xml格式數據
*
*/
//本地PC:url地址
def url = 'http://127.0.0.1/api/v3/apiTest/getTestJson'
OkHttpClient client = new OkHttpClient()
Request request = new Request.Builder()
.url(url)
.get()
.build()
//1.獲取response
def res = client.newCall(request).execute()
def resStr = new String(res.body().bytes())
//2.使用JsonSlurper將jsonstr轉換為Object類對象
JsonSlurper js = new JsonSlurper()
Langs langs = js.parseText(resStr)
//Langs langs = js.parseText(resJson)
//3.將Object轉換為xml格式字符串:MarkupBuilder
StringWriter sw = new StringWriter()
MarkupBuilder mb = new MarkupBuilder(sw)
mb.langs(type: langs.type,count:langs.count,mainstream:langs.mainstream){
langs.languages.each { _lang ->
language(flavor:_lang.flavor,version:_lang.version,_lang.value)
}
}
//4.將xml數據寫入文件
saveFile(sw.toString(),'../../release.xml')
/**
* 寫入文件操作
* */
def saveFile(String source,String desFilePath){
try {
File desFile = new File(desFilePath)
if(!desFile.exists()){
desFile.createNewFile()
}
desFile.withWriter {
it.write(source)
}
return true
}catch(Exception e){
return false
}
}
//json實體對象
class Langs {
String type
int count
boolean mainstream
def languages = []
}
class Language {
String flavor
String version
String value
}
這里結合我們前面講解的關于文件操作,xml和json等數據格式操作,從網絡上讀取json數據,寫入xml格式到我們本地項目的路徑,大家可以根據我們前面所講自己去實現一個類似的邏輯,多動手,相信你對groovy會有更深的理解。
總結:
本篇主要講解了我們使用groovy
語言的基本用法,因為也是基于jvm
的語言,對于有java
基礎的同學學起來應該會很輕松
后面會繼續講解其他關于Gradle
的關鍵知識,敬請期待。。
-
JAVA
+關注
關注
19文章
2966瀏覽量
104707 -
XML
+關注
關注
0文章
188瀏覽量
33079
發布評論請先 登錄
相關推薦
評論