0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

Gradle入門知識(shí)之Gradle語法3

jf_78858299 ? 來源:小余的自習(xí)室 ? 作者:小余的自習(xí)室 ? 2023-03-30 11:04 ? 次閱讀

8.XML

java中處理xml:使用的一般是dom文檔驅(qū)動(dòng)處理或者sax事件驅(qū)動(dòng)處理

groovy處理xml

  • 8.1: groovy中如何解析xml

    使用XmlSlurper進(jìn)行解析

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開發(fā)藝術(shù)探索<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源碼設(shè)計(jì)模式<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()

打印結(jié)果:
[瘋狂Android講義, Vue從入門到精通]
這里我們找到所有的李剛的書名
  • 8.2:xml節(jié)點(diǎn)遍歷

深度遍歷:遍歷所有的李剛的書名

def depFirst = response.depthFirst().findAll { book ->
    return book.author.text() == '李剛' ? true : false
}.collect { book ->
    book.title
}
println depFirst.toListString()

打印結(jié)果:[瘋狂Android講義, Vue從入門到精通]

廣度遍歷

def name1 = response.value.books.children().findAll { node ->
    node.name() =='book' && node.@id == '2'‘
}.collect { node ->
    node.title
}
println name1
打印結(jié)果:[第一行代碼]
  • 8.3:groovy中如何創(chuàng)建一個(gè)xml:使用MarkupBuilder

需求:生成xml格式數(shù)據(jù)

/**
 * 生成xml格式數(shù)據(jù)
 * 
 */
 //根據(jù)類動(dòng)態(tài)生成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實(shí)戰(zhàn):

下面我用一個(gè)Groovy實(shí)戰(zhàn)項(xiàng)目來總結(jié)前面所講的內(nèi)容:

項(xiàng)目需求:從網(wǎng)絡(luò)上獲取當(dāng)前版本信息,然后使用groovy腳本將獲取到的版本信息寫入到本地文件中

  • 1.groovy環(huán)境搭建

    下載最新版本的Intellij IDEA:筆者使用的版本:20220103版本

  • 2.創(chuàng)建groovy工程

gradle項(xiàng)目實(shí)戰(zhàn)1.png

  • 3.添加OkHttp網(wǎng)絡(luò)請(qǐng)求庫(kù)

這里我們?yōu)榱朔奖?,使用了我們android中常用的網(wǎng)絡(luò)請(qǐng)求庫(kù)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格式數(shù)據(jù)
 * 
 */

//本地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轉(zhuǎn)換為Object類對(duì)象
JsonSlurper js = new JsonSlurper()
Langs langs = js.parseText(resStr)
//Langs langs = js.parseText(resJson)
//3.將Object轉(zhuǎn)換為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數(shù)據(jù)寫入文件
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實(shí)體對(duì)象
class Langs {
    String type
    int count
    boolean mainstream
    def languages = []
}
class Language {
    String flavor
    String version
    String value
}

這里結(jié)合我們前面講解的關(guān)于文件操作,xml和json等數(shù)據(jù)格式操作,從網(wǎng)絡(luò)上讀取json數(shù)據(jù),寫入xml格式到我們本地項(xiàng)目的路徑,大家可以根據(jù)我們前面所講自己去實(shí)現(xiàn)一個(gè)類似的邏輯,多動(dòng)手,相信你對(duì)groovy會(huì)有更深的理解。

總結(jié):

本篇主要講解了我們使用groovy語言的基本用法,因?yàn)橐彩腔?code>jvm的語言,對(duì)于有java基礎(chǔ)的同學(xué)學(xué)起來應(yīng)該會(huì)很輕松

后面會(huì)繼續(xù)講解其他關(guān)于Gradle的關(guān)鍵知識(shí),敬請(qǐng)期待。。

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • JAVA
    +關(guān)注

    關(guān)注

    19

    文章

    2973

    瀏覽量

    104932
  • XML
    XML
    +關(guān)注

    關(guān)注

    0

    文章

    188

    瀏覽量

    33107
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    Gradle版本目錄功能的簡(jiǎn)單應(yīng)用

    版本帝 Gradle 最新版本已經(jīng)到了 8.1.1 ,你是不是還在用著 Gradle 3 的功能?今天我們了解一下 Gradle 7.0 之后推出的新功能 Version Catalo
    的頭像 發(fā)表于 09-30 11:12 ?1395次閱讀

    gradle安裝與配置unity

    Gradle是一種用于構(gòu)建和自動(dòng)化構(gòu)建過程的強(qiáng)大工具,而Unity則是一款跨平臺(tái)的游戲引擎。在Unity項(xiàng)目中使用Gradle可以幫助我們更方便地管理和構(gòu)建項(xiàng)目,同時(shí)能夠提供更高的自定義能力和穩(wěn)定性
    的頭像 發(fā)表于 12-07 14:48 ?2351次閱讀

    Android Studio與Gradle深入

    小語言規(guī)范用來處理一個(gè)特定的事情(大多情況下是配置)。Android 的插件的 DSL 文檔在 Android Gradle DSL有說明?! ±斫饬艘陨匣A(chǔ)之后,你就會(huì)知其然,知其所以然了?! ∫陨?b class='flag-5'>知識(shí)
    發(fā)表于 08-31 17:58

    Gradle for Android

    Gradle for Android
    發(fā)表于 07-16 15:50

    請(qǐng)問OpenHarmony鴻蒙demo gradle報(bào)錯(cuò)怎么解決?

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

    快速入門Gradle的方法

    我們前面的Gradle是一門基于Groov的DSL,可能很多童鞋就是因?yàn)槟闶沁@個(gè)Gradle的迷,第一覺得Gradle是一門獨(dú)立的語言呀,如果想進(jìn)入歧途了,我一開始也是這么迷糊的,當(dāng)你了解之后,你就可以這么理解
    的頭像 發(fā)表于 04-08 10:56 ?1369次閱讀
    快速<b class='flag-5'>入門</b><b class='flag-5'>Gradle</b>的方法

    Gradle入門知識(shí)Gradle詳解

    大家回想一下自己第一次接觸`Gradle`是什么時(shí)候? 相信大家也都是和我一樣,在我們打開第一個(gè)AS項(xiàng)目的時(shí)候, 發(fā)現(xiàn)有很多帶gradle字樣的文件:`setting.gradle, build.
    的頭像 發(fā)表于 03-30 10:47 ?2553次閱讀
    <b class='flag-5'>Gradle</b><b class='flag-5'>入門</b><b class='flag-5'>知識(shí)</b><b class='flag-5'>之</b><b class='flag-5'>Gradle</b>詳解

    Gradle入門知識(shí)Gradle詳解(下)

    大家回想一下自己第一次接觸`Gradle`是什么時(shí)候? 相信大家也都是和我一樣,在我們打開第一個(gè)AS項(xiàng)目的時(shí)候, 發(fā)現(xiàn)有很多帶gradle字樣的文件:`setting.gradle, build.
    的頭像 發(fā)表于 03-30 10:51 ?900次閱讀
    <b class='flag-5'>Gradle</b><b class='flag-5'>入門</b><b class='flag-5'>知識(shí)</b><b class='flag-5'>之</b><b class='flag-5'>Gradle</b>詳解(下)

    Gradle入門知識(shí)Gradle語法1

    很多開發(fā)喜歡把`Gradle`簡(jiǎn)單定義為一種構(gòu)建工具,和`ant,maven`等作用類似, 誠(chéng)然Gradle確實(shí)是用來做構(gòu)建,但是如果簡(jiǎn)單得把Gradle拿來做構(gòu)建,就太小看Gradle
    的頭像 發(fā)表于 03-30 10:54 ?1036次閱讀
    <b class='flag-5'>Gradle</b><b class='flag-5'>入門</b><b class='flag-5'>知識(shí)</b><b class='flag-5'>之</b><b class='flag-5'>Gradle</b><b class='flag-5'>語法</b>1

    Gradle入門知識(shí)Gradle語法2

    很多開發(fā)喜歡把`Gradle`簡(jiǎn)單定義為一種構(gòu)建工具,和`ant,maven`等作用類似, 誠(chéng)然Gradle確實(shí)是用來做構(gòu)建,但是如果簡(jiǎn)單得把Gradle拿來做構(gòu)建,就太小看Gradle
    的頭像 發(fā)表于 03-30 10:54 ?765次閱讀

    Gradle入門知識(shí)Gradle api解析(上)

    由于Project源碼篇幅太長(zhǎng):這里只列出類的部分方法和屬性: 我們前面分析過,每個(gè)build.gradle對(duì)應(yīng)一個(gè)Project,Project在初始過程中會(huì)被構(gòu)建為`樹`形結(jié)構(gòu):
    的頭像 發(fā)表于 03-30 11:01 ?2401次閱讀
    <b class='flag-5'>Gradle</b><b class='flag-5'>入門</b><b class='flag-5'>知識(shí)</b><b class='flag-5'>之</b><b class='flag-5'>Gradle</b> api解析(上)

    Gradle入門知識(shí)Gradle api解析(下)

    由于Project源碼篇幅太長(zhǎng):這里只列出類的部分方法和屬性: 我們前面分析過,每個(gè)build.gradle對(duì)應(yīng)一個(gè)Project,Project在初始過程中會(huì)被構(gòu)建為`樹`形結(jié)構(gòu):
    的頭像 發(fā)表于 03-30 11:05 ?1122次閱讀

    Gradle Plugin和AGP的區(qū)別1

    Gradle Plugin`和`AGP`的區(qū)別? `Gradle Plugin`是`Gradle`構(gòu)建過程中使用的插件的總稱,而`Android Gradle Plugin`是這
    的頭像 發(fā)表于 03-30 11:48 ?1256次閱讀
    <b class='flag-5'>Gradle</b> Plugin和AGP的區(qū)別1

    Gradle Plugin和AGP的區(qū)別2

    Gradle Plugin`和`AGP`的區(qū)別? `Gradle Plugin`是`Gradle`構(gòu)建過程中使用的插件的總稱,而`Android Gradle Plugin`是這
    的頭像 發(fā)表于 03-30 11:49 ?1194次閱讀

    Gradle Plugin和AGP的區(qū)別3

    Gradle Plugin`和`AGP`的區(qū)別? `Gradle Plugin`是`Gradle`構(gòu)建過程中使用的插件的總稱,而`Android Gradle Plugin`是這
    的頭像 發(fā)表于 03-30 11:50 ?1284次閱讀