Gradle系列七之xml文件解析

作者: zhang_pan | 来源:发表于2019-05-27 17:14 被阅读2次

    定义一个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
    

    打印输出结果一样。

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

    相关文章

      网友评论

        本文标题:Gradle系列七之xml文件解析

        本文链接:https://www.haomeiwen.com/subject/kfohtctx.html