본문 바로가기

Script/Groovy

16. Builder

Groovy 에서는 XML, JSON, HTML 등의 Markup 언어에 대한 Builder 를 제공하여
 
이를 쉽게 만들수 있으며 반대로 Parser 도 제공하여 해당 언어를
 
Groovy 에서 쉽게 파싱하여 사용하도록 하고 있다.
 
이번장에서는 이와 관련된 몇개의 빌더에 대해 알아보도록 하자.
 
 
 
XML
 
간단히 아래와 같이 입력하면 XML 이 뚝딱 만들어진다.
 
JAVA 나 다른 언어에 비해 표현이 아주 쉽다.
 
아래 예에서는 기본 생성자로 만들었지만 생성자에 FileStream 등을 파라미터로 값으로 주면
 
출력 대상으로 지정할 수 있다.
 
다른 유용한 테스트는 아래 사이트를 통해 확인하자.
 
https://github.com/apache/groovy/tree/master/subprojects/groovy-xml/src/test/groovy/groovy/xml
 
import groovy.xml.MarkupBuilder
 
def builder = new MarkupBuilder() 
 
builder.sports {
  sport(id:1) {
    name 'Baseball'
  }
  sport(id:2) {
    name 'Football'
  }
  sport(id:3) {
    name 'Hockey'
  }
}
<sports>
  <sport id='1'>
    <name>Baseball</name>
  </sport>
  <sport id='2'>
    <name>Football</name>
  </sport>
  <sport id='3'>
    <name>Hockey</name>
  </sport>
</sports>
 
그렇다면 XML 에 id 나 속성 값이 없는 경우는 어떻게 해야 할까?
 
아래와 같이 이런 경우 비어있는 속성을 보여줄지
 
아니면 생략할지를 결정하는 인자가 있어 설정만 하면 된다.
 
import groovy.xml.MarkupBuilder
 
def builder = new MarkupBuilder()
builder.omitEmptyAttributes = true
builder.omitNullAttributes = true
 
builder.sports {
  sport(id:1) {
    name 'Baseball'
  }
  sport(id:2) {
    name 'Football'
  }
  sport(id:3) {
    name 'Hockey'
  }
  sport(id:null) {
    name ''
  }
}
<sports>
  <sport id='1'>
    <name>Baseball</name>
  </sport>
  <sport id='2'>
    <name>Football</name>
  </sport>
  <sport id='3'>
    <name>Hockey</name>
  </sport>
  <sport>
    <name></name>
  </sport>
</sports>
 
 
 
HTML
 
HTML 이라고 HTML 빌더가 따로 있는건 아니다. 
 
어짜피 HTML 도 XML 과 키워드만 다르고 형식은 틀리지 않기 때문이다.
 
import groovy.xml.MarkupBuilder
 
FileWriter writer = new FileWriter('html/about.html')
def builder = new MarkupBuilder(writer) 
 
builder.omitEmptyAttributes = true
builder.omitNullAttributes = true
 
def cources = [
  [id:1, name:'Apache Groovy'],
  [id:2, name:'Sprint Boot']
]
 
builder.html {
  head {
    title 'About HTLM Markup'
    description 'This is example'
    keywords 'Daeung, Groovy'
  }
  body {
    h1 'About Me'
    p 'This is a bunch of text'
    section {
      h2 'Courses'
      table {
        tr {
          th 'id'
          th 'name'
        }
        cources.each {course ->
          tr {
            td course.id
            td course.name
          }
        }
      }
    }
  }
}
<html>
  <head>
    <title>About HTLM Markup</title>
    <description>This is example</description>
    <keywords>Daeung, Groovy</keywords>
  </head>
  <body>
    <h1>About Me</h1>
    <p>This is a bunch of text</p>
    <section>
      <h2>Courses</h2>
      <table>
        <tr>
          <th>id</th>
          <th>name</th>
        </tr>
        <tr>
          <td>1</td>
          <td>Apache Groovy</td>
        </tr>
        <tr>
          <td>2</td>
          <td>Sprint Boot</td>
        </tr>
      </table>
    </section>
  </body>
</html>
 
 
 
JSON
 
xml, html 과 달리 JSON 을 위한 Markup Builder 는 따로 있지만 사용 방법은 대동소이 하다.
 
import groovy.json.JsonBuilder
 
JsonBuilder builder = new JsonBuilder()
 
 
builder.books {
  book {
    title 'The 4 Hour Work Week'
    isbn '123421234-adfa-asdcac'
    author( first:'Timothy', last:'Ferriss')
    related 'The 4 Hour Body', 'The 4 Hour Chef'
  }
}
 
println builder.toPrettyString()
{
    "books": {
        "book": {
            "title": "The 4 Hour Work Week",
            "isbn": "123421234-adfa-asdcac",
            "author": {
                "first": "Timothy",
                "last": "Ferriss"
            },
            "related": [
                "The 4 Hour Body",
                "The 4 Hour Chef"
            ]
        }
    }
}
 
 
 
Object Graph Builder
 
또 하나의 유용한 Builder 는 Object Graph Builder 이다.
 
이 Builder 는 Tree 구조의 Class 를 초기화 할 때 사용하는데
 
기존 JAVA 에서 사용되는 방식에 비해 보기 편하고 읽기 편하게 객체를 생성해 준다.
 
import groovy.json.JsonBuilder
import groovy.transform.ToString
 
@ToString(includeNames = true)
class Book {
  String title
  String summary
  List<Section> sections = []
}
 
@ToString(includeNames = true)
class Section {
  String title
  List<Chapter> chapters = []
}
 
@ToString(includeNames = true)
class Chapter {
  String title
}
 
/* JAVA Style
Book b = new Book();
b.setTitle("My Book")
b.setSummary("My Summary")
 
Section s = new Section();
s.setTitle("My Section")
 
Chapter c = new Chapter();
c.setTitle("My Chapter")
 
s.addChapter(c)
b.addSection(s)
 
return book
*/
 
ObjectGraphBuilder builder = new ObjectGraphBuilder()
def book = builder.book( title: "Groovy In Action 2nd Edition", summary: "Groovy In Action, Second Edition is a revised") {
                            section(title :"Section 1") {
                               chapter(title: "Chapter 1")
                               chapter(title: "Chapter 2")
                               chapter(title: "Chapter 3")
                            }
                            section(title :"Section 2") {
                               chapter(title:"Chapter 4")
                               chapter(title:"Chapter 5")
                               chapter(title:"Chapter 6")
                            }
}
 
println book
assert book.sections.size() == 2
Book(
title:Groovy In Action 2nd Edition, 
summary:Groovy In Action, Second Edition is a revised, 
sections:[
    Section(title:Section 1, chapters:[
               Chapter(title:Chapter 1), 
               Chapter(title:Chapter 2), 
               Chapter(title:Chapter 3)]), 
    Section(title:Section 2, chapters:[
               Chapter(title:Chapter 4), 
               Chapter(title:Chapter 5), 
               Chapter(title:Chapter 6)])])
 
 
 
 
List Of Builders
 
이외에도 SteamingMarkupBuilder , StreamingJsonBuilder, NodeBuilder,
 
SwingBuilder, FileTreeBuilder 등 다양한 Builder 를 제공한다.
 
 
XML parser
 
이번에는 XML 파서를 한번 사용해 보자.
 
간단히 XmlSlurper 라는 클래스를 사용하면 된다.
 
import groovy.xml.MarkupBuilder
 
//---------------------------------------------------------------------------------
// String 에서 읽어 XML 파싱
//---------------------------------------------------------------------------------
 
def xml = '''
<sports>
  <sport id="1">
      <name>BaseBall</name>
  </sport>
  <sport id="2">
      <name>BasketBall</name>
  </sport>
  <sport id="3">
      <name>Hockey</name>
  </sport>
</sports>
'''
 
def sports = new XmlSlurper().parseText(xml)
println sports.sport.name
 
//---------------------------------------------------------------------------------
// File 에서 읽어 XML 파싱
//---------------------------------------------------------------------------------
 
FileWriter writer = new FileWriter('C:/Users/dukim/Downloads/sports.xml')
MarkupBuilder builder = new MarkupBuilder(writer)
builder.doubleQuotes = true
 
builder.sports {
  sport(id:1){
    name 'Judo'
  }
  sport(id:2){
    name 'PingPong'
  }
}
 
def sports2 = new XmlSlurper().parse('C:/Users/dukim/Downloads/sports.xml')
println sports2.sport.name
 
BaseBallBasketBallHockey
JudoPingPong
 
 
JSON parser
 
이번에는 JSON 파서를 한번 사용해 보자.
 
간단히 JsonSlurper 라는 클래스를 사용하면 된다.
 
import groovy.json.JsonBuilder
import groovy.json.JsonSlurper
 
JsonBuilder builder = new JsonBuilder()
builder.books {
  book {
title 'The 4 Hour Work Week'
isbn '123421234-adfa-asdcac'
author( first:'Timothy', last:'Ferriss')
related 'The 4 Hour Body', 'The 4 Hour Chef'
}
}
 
new File('C:/Users/dukim/Downloads/test.json').write(builder.toPrettyString())
 
JsonSlurper slurper = new JsonSlurper()
def json = slurper.parse(new File('C:/Users/dukim/Downloads/test.json'))
 
println json.books.book.title
The 4 Hour Work Week
 
 
 
 
 
 
 
 
 
 

'Script > Groovy' 카테고리의 다른 글

17. Rest  (0) 2020.01.21
15. MOP - Compile Time  (0) 2020.01.21
14. MOP - Runtime  (0) 2020.01.21
13. OOP  (0) 2020.01.21
12. Exception  (0) 2020.01.21