====== Groovy XML ======
===== XMLParser =====
* [[http://groovy.codehaus.org/Reading+XML+using+Groovy%27s+XmlParser|Groovy - Reading XML using Groovy's XmlParser]]
* [[http://groovy.codehaus.org/Updating+XML+with+XmlParser|Groovy - Updating XML with XmlParser]]
==== Namespace ====
[[http://groovy.codehaus.org/api/groovy/xml/Namespace.html|groovy.xml.Namespace]]
Namespace가 존재할 경우 각 노드의 이름([[http://groovy.codehaus.org/api/groovy/xml/QName.html|QName]])구조가 달라진다. ''pom.xml'' 파일을 파싱한다고 했을 때 다음과 같이한다.
def pom = new XmlParser().parse(new File('pom.xml'))
def ns = new groovy.xml.Namespace('http://maven.apache.org/POM/4.0.0')
def items = pom[ns.dependencies][ns.dependency][ns.scope].findAll {
it.text() == "optional"
}.each {
println it.text()
}
===== XML Builder =====
* ''MarkupBuilder''
* ''StreamingMarkupBuilder'' : ''mkp''를 통해 각종 설정 가능.
* [[https://stackoverflow.com/questions/11388838/groovy-markupbuilder-name-conflict/11389034#11389034|Groovy MarkupBuilder name conflict]] 생성할 XML 태그 이름이 이미 Groovy Object에 존재하는 메소드 이름일 경우 충돌 해결 conflict
// ....
identity([:]) {
groupId(catalog.groupId)
artifactId(catalog.artifactId)
version(catalog.version)
}
// 뒤에 ([:]) 로 호출하여 다른 메소드 시그너처로 바꿔치기함
* 혹은 ''delegate.tagname'' 으로 충돌해소 가능 [[http://mrhaki.blogspot.kr/2012/01/groovy-goodness-solve-naming-conflicts.html|Groovy Goodness: Solve Naming Conflicts with Builders]]
def builder = new MarkupBuilder(writer)
builder.message {
delegate.body(contentType: 'plain') {
text 'Simple message'
}
}
// -->
Simple message
===== Pretty Print =====
* [[http://mrhaki.blogspot.kr/2012/10/groovy-goodness-pretty-print-xml.html|Groovy Pretty Print XML]]
println XmlUtil.serialize(xmlDocument) // 문자열 혹은 SteramingMarkupBuilder 객체 등.
===== DOMBuilder =====
* [[http://docs.groovy-lang.org/latest/html/api/groovy/xml/DOMBuilder.html|DOMBuilder]]