Groovy 에서는 XML, JSON, HTML 등의 Markup 언어에 대한 Builder 를 제공하여
이를 쉽게 만들수 있으며 반대로 Parser 도 제공하여 해당 언어를
Groovy 에서 쉽게 파싱하여 사용하도록 하고 있다.
이번장에서는 이와 관련된 몇개의 빌더에 대해 알아보도록 하자.
XML
간단히 아래와 같이 입력하면 XML 이 뚝딱 만들어진다.
JAVA 나 다른 언어에 비해 표현이 아주 쉽다.
아래 예에서는 기본 생성자로 만들었지만 생성자에 FileStream 등을 파라미터로 값으로 주면
출력 대상으로 지정할 수 있다.
다른 유용한 테스트는 아래 사이트를 통해 확인하자.
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 |