Gradle系列七之xml文件解析

定义一个xml格式数据:

final String xml = '''
    <response version-api="2.0">
        <value>
            <books id="1" classification="android">
                <book available="20" id="1">
                    <title>疯狂Android讲义</title>
                    <author id="1">李刚</author>
                </book>
                <book available="14" id="2">
                   <title>第一行代码</title>
                   <author id="2">郭林</author>
               </book>
               <book available="13" id="3">
                   <title>Android开发艺术探索</title>
                   <author id="3">任玉刚</author>
               </book>
               <book available="5" id="4">
                   <title>Android源码设计模式</title>
                   <author id="4">何红辉</author>
               </book>
           </books>
           <books id="2" classification="web">
               <book available="10" id="1">
                   <title>Vue从入门到精通</title>
                   <author id="4">李刚</author>
               </book>
           </books>
       </value>
    </response>

解析数据:

def xmlSlurper = new XmlSlurper()
def response = xmlSlurper.parseText(xml)
println response.value.books[0].book[0].title
println response.value.books[1].book.@available
println response.value.books[0].book[1].author

打印输出如下:

疯狂Android讲义
10
郭林

查询作者是李刚的书名:

def listBook = []
response.value.books.each { books ->
    books.book.each { book ->
        if (book.author == '李刚') {
            listBook.add(book.title)
        }
    }
}
println listBook

打印输出如下:

[疯狂Android讲义, Vue从入门到精通]
深度遍历xml数据(可以用**替换depthFirst())
def listTitle = response.depthFirst().findAll { book ->
    book.author == '李刚'
}.collect { book ->
    book.title
}
println listTitle

打印输出如下:

[疯狂Android讲义, Vue从入门到精通]
广度遍历xml数据(可以用*替换children())
println response.value.books.children().findAll { node ->
    node.name() == 'book' && node.@id == '2'
}.collect { node ->
    node.title
}

打印输出如下:

[第一行代码]
Groovy中如何创建一个xml格式数据

现在有一个xml格式数据:

<langs type='current' count='3' mainstream='true'>
    <language flavor='static' version='1.5'>Java</language>
    <language flavor='dynamic' version='1.6'>Groovy</language>
    <language flavor='dynamic' version='1.9'>JavaScript</language>
</langs>

我们接下来要做的就是用代码生成这段xml数据:

def sw = new StringWriter()
def xmlBuilder = new MarkupBuilder(sw) //用来生成xml数据的核心类
xmlBuilder.langs(type: 'current', count: '3', mainstream: 'true') {
    language(flavor: 'static', version: '1.5', 'Java')
    language(flavor: 'dynamic', version: '1.6', 'Groovy')
    language(flavor: 'dynamic', version: '1.9', 'JavaScript')
}
println sw

打印输出如下:

<langs type='current' count='3' mainstream='true'>
  <language flavor='static' version='1.5'>Java</language>
  <language flavor='dynamic' version='1.6'>Groovy</language>
  <language flavor='dynamic' version='1.9'>JavaScript</language>
</langs>

但是事实上,我们往往不是这样去拼凑xml数据的,而是通过数据类来得到xml数据的:

class Langs {
    String type = 'current'
    int count = 3
    boolean mainstream = true
    def languages = [new language(flavor: 'static', version: 1.5, value: 'Java'),
                     new language(flavor: 'dynamic', version: 1.6, value: 'Groovy'),
                     new language(flavor: 'dynamic', version: 1.9, value: 'JavaScript')]
}

class language {
    String flavor
    float version
    String value
}

def sw = new StringWriter()
def xmlBuilder = new MarkupBuilder(sw) //用来生成xml数据的核心类
def langs = new Langs()
xmlBuilder.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

打印输出结果一样。

喜欢本篇博客的简友们,就请来一波点赞,您的每一次关注,将成为我前进的动力,谢谢!

猜你喜欢

转载自blog.csdn.net/weixin_34358365/article/details/90863811
今日推荐