Gradle入门知识之Gradle语法3

电子说

1.3w人已加入

描述

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脚本将获取到的版本信息写入到本地文件中

  • 1.groovy环境搭建

    下载最新版本的Intellij IDEA:笔者使用的版本:20220103版本

  • 2.创建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的关键知识,敬请期待。。

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分