0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

Gradle入门知识之Gradle语法3

jf_78858299 来源:小余的自习室 作者:小余的自习室 2023-03-30 11:04 次阅读

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的关键知识,敬请期待。。

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

    关注

    19

    文章

    2972

    浏览量

    104869
  • XML
    XML
    +关注

    关注

    0

    文章

    188

    浏览量

    33104
收藏 人收藏

    评论

    相关推荐

    Gradle版本目录功能的简单应用

    版本帝 Gradle 最新版本已经到了 8.1.1 ,你是不是还在用着 Gradle 3 的功能?今天我们了解一下 Gradle 7.0 之后推出的新功能 Version Catalo
    的头像 发表于 09-30 11:12 1377次阅读

    gradle安装与配置unity

    Gradle是一种用于构建和自动化构建过程的强大工具,而Unity则是一款跨平台的游戏引擎。在Unity项目中使用Gradle可以帮助我们更方便地管理和构建项目,同时能够提供更高的自定义能力和稳定性
    的头像 发表于 12-07 14:48 2302次阅读

    Android Studio与Gradle深入

    小语言规范用来处理一个特定的事情(大多情况下是配置)。Android 的插件的 DSL 文档在 Android Gradle DSL有说明。  理解了以上基础之后,你就会知其然,知其所以然了。  以上知识
    发表于 08-31 17:58

    Gradle for Android

    Gradle for Android
    发表于 07-16 15:50

    请问OpenHarmony鸿蒙demo gradle报错怎么解决?

    [build_d4wwgdfsrmyu3wivei5s3deyo$_run_closure1@1db3e190] on root project 'HarmonyAPP' of type org.gradle.api.Proj
    发表于 04-01 11:27

    快速入门Gradle的方法

    我们前面的Gradle是一门基于Groov的DSL,可能很多童鞋就是因为你是这个Gradle的迷,第一觉得Gradle是一门独立的语言呀,如果想进入歧途了,我一开始也是这么迷糊的,当你了解之后,你就可以这么理解
    的头像 发表于 04-08 10:56 1348次阅读
    快速<b class='flag-5'>入门</b><b class='flag-5'>Gradle</b>的方法

    Gradle入门知识Gradle详解

    大家回想一下自己第一次接触`Gradle`是什么时候? 相信大家也都是和我一样,在我们打开第一个AS项目的时候, 发现有很多带gradle字样的文件:`setting.gradle, build.
    的头像 发表于 03-30 10:47 2540次阅读
    <b class='flag-5'>Gradle</b><b class='flag-5'>入门</b><b class='flag-5'>知识</b><b class='flag-5'>之</b><b class='flag-5'>Gradle</b>详解

    Gradle入门知识Gradle详解(下)

    大家回想一下自己第一次接触`Gradle`是什么时候? 相信大家也都是和我一样,在我们打开第一个AS项目的时候, 发现有很多带gradle字样的文件:`setting.gradle, build.
    的头像 发表于 03-30 10:51 887次阅读
    <b class='flag-5'>Gradle</b><b class='flag-5'>入门</b><b class='flag-5'>知识</b><b class='flag-5'>之</b><b class='flag-5'>Gradle</b>详解(下)

    Gradle入门知识Gradle语法1

    很多开发喜欢把`Gradle`简单定义为一种构建工具,和`ant,maven`等作用类似, 诚然Gradle确实是用来做构建,但是如果简单得把Gradle拿来做构建,就太小看Gradle
    的头像 发表于 03-30 10:54 1017次阅读
    <b class='flag-5'>Gradle</b><b class='flag-5'>入门</b><b class='flag-5'>知识</b><b class='flag-5'>之</b><b class='flag-5'>Gradle</b><b class='flag-5'>语法</b>1

    Gradle入门知识Gradle语法2

    很多开发喜欢把`Gradle`简单定义为一种构建工具,和`ant,maven`等作用类似, 诚然Gradle确实是用来做构建,但是如果简单得把Gradle拿来做构建,就太小看Gradle
    的头像 发表于 03-30 10:54 750次阅读

    Gradle入门知识Gradle api解析(上)

    由于Project源码篇幅太长:这里只列出类的部分方法和属性: 我们前面分析过,每个build.gradle对应一个Project,Project在初始过程中会被构建为`树`形结构:
    的头像 发表于 03-30 11:01 2390次阅读
    <b class='flag-5'>Gradle</b><b class='flag-5'>入门</b><b class='flag-5'>知识</b><b class='flag-5'>之</b><b class='flag-5'>Gradle</b> api解析(上)

    Gradle入门知识Gradle api解析(下)

    由于Project源码篇幅太长:这里只列出类的部分方法和属性: 我们前面分析过,每个build.gradle对应一个Project,Project在初始过程中会被构建为`树`形结构:
    的头像 发表于 03-30 11:05 1099次阅读

    Gradle Plugin和AGP的区别1

    Gradle Plugin`和`AGP`的区别? `Gradle Plugin`是`Gradle`构建过程中使用的插件的总称,而`Android Gradle Plugin`是这
    的头像 发表于 03-30 11:48 1239次阅读
    <b class='flag-5'>Gradle</b> Plugin和AGP的区别1

    Gradle Plugin和AGP的区别2

    Gradle Plugin`和`AGP`的区别? `Gradle Plugin`是`Gradle`构建过程中使用的插件的总称,而`Android Gradle Plugin`是这
    的头像 发表于 03-30 11:49 1178次阅读

    Gradle Plugin和AGP的区别3

    Gradle Plugin`和`AGP`的区别? `Gradle Plugin`是`Gradle`构建过程中使用的插件的总称,而`Android Gradle Plugin`是这
    的头像 发表于 03-30 11:50 1270次阅读