电子说
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从入门到精通]
这里我们找到所有的李刚的书名
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
打印结果:[第一行代码]
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
下面我用一个Groovy实战项目来总结前面所讲的内容:
项目需求:从网络上获取当前版本信息,然后使用groovy脚本将获取到的版本信息写入到本地文件中
1.groovy环境搭建
下载最新版本的Intellij IDEA
:笔者使用的版本:20220103
版本
2.创建groovy工程
:
gradle项目实战1.png
添加OkHttp网络请求库
这里我们为了方便,使用了我们android中常用的网络请求库OkHttp
okhttp.png
完整代码
如下: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
的关键知识,敬请期待。。
全部0条评论
快来发表一下你的评论吧 !