一.XML
package main.groovy.L12
import groovy.xml.MarkupBuilder
import groovy.xml.StreamingMarkupBuilder
def fw = new FileWriter(new File("test.xml"))
def builder = new MarkupBuilder(fw)
builder.html {
mkp.comment("注释")
head ("hello",key:'value'){
title("title")
}
body {
}
}
def sb = new StreamingMarkupBuilder()
sb.encoding = "UTF-8"
def closure = {
mkp.xmlDeclaration()
html {
head(id:1)
}
}
def sw = sb.bind(closure)
println sw.toString()
生成的test.xml文件
<html><!-- 注释 -->
<head key='value'>hello
<title>title</title>
</head>
<body />
</html>
打印输出
<?xml version='1.0' encoding='UTF-8'?>
<html><head id='1'/></html>
def parser = new XmlParser().parse(new File('Test3.xml'))
def ns = new Namespace('uri','prefix')
println ns.name33
println ns.key
//
Node node = parser.B[0]
node.attributes().each {
println it
}
println node.attribute(ns.key)
println node.attribute('key3')
//
Node meta = node.'meta-data'[0]
node.remove(meta)
node.appendNode('meta-data',[(ns.key):'newValue',(ns.key2):'value2'])
new XmlNodePrinter(new PrintWriter(new File('Test4.xml'))).print(parser)
Test3.xml
<manifest xmlns:prefix="uri"><!-- 注释 -->
<B
prefix:key="AAA"
prefix:key2="BBB"
key3="ccc">
<meta-data value = "BBB"></meta-data>
</B>
</manifest>
Test4.xml
<manifest>
<B prefix:key="AAA" xmlns:prefix="uri" prefix:key2="BBB" key3="ccc">
<meta-data prefix:key="newValue" prefix:key2="value2"/>
</B>
</manifest>
打印输出
{uri}name33
{uri}key
{uri}key=AAA
{uri}key2=BBB
key3=ccc
AAA
ccc
二.JSON
import groovy.json.JsonBuilder
import groovy.json.JsonOutput
import groovy.json.JsonSlurper
def builder = new JsonBuilder()
builder.jsonAA {
key1 "value1"
key2 "value2"
}
println '1:' + builder
builder {
key1 "value1"
key2 "value2"
}
println '2:' + builder
class Person {
def key1
def key2
}
def p = new Person(key1:"value1",key2:"value")
//转换对象为Json数据
def a = new JsonBuilder(p)
println '3:' + a.toString()
println '4:' + JsonOutput.toJson(p)
//格式化Json数据
println '5:' + JsonOutput.prettyPrint(JsonOutput.toJson(p))
def slurper = new JsonSlurper();
def object = slurper.parseText(JsonOutput.toJson(p))
println '6:' + object
Person person = slurper.parseText(JsonOutput.toJson(p))
println '7:' + person.key1
println '8:'+ person.key2
打印输出
1:{"jsonAA":{"key1":"value1","key2":"value2"}}
2:{"key1":"value1","key2":"value2"}
3:{"key2":"value","key1":"value1"}
4:{"key2":"value","key1":"value1"}
5:{
"key2": "value",
"key1": "value1"
}
6:[key2:value, key1:value1]
7:value1
8:value
三.Swing使用
def builder = new SwingBuilder()
def swing = builder.frame(title:'title',size:[100,100],layout:new FlowLayout(),defaultCloseOperation: WindowConstants.EXIT_ON_CLOSE) {
label(text:'text')
button(text:'button',actionPerformed: {
})
}
swing.setVisible(true)
输出,在左上角弹出框

四.自定义BuilderSupport(MarkupBuilder继承该类)
MyBuilderSupport.groovy
package main.groovy.L12.builder
class MyBuilderSupport extends BuilderSupport{
class Node {
String name
String value
Map attr
def children
Node(String name, String value, Map attr) {
this.name = name
this.value = value
this.attr = attr
children = []
}
//<xml key='value' />
// <xml key='value' >xxx<xml>
void build(Writer writer) {
writer.write("<$name")
if(attr) {
attr.each {
key,value ->
writer.write(" $key='$value' ")
}
}
if(value || children) {
writer.write(">")
if(value) {
writer.write(value)
}
children.each {
it.build(writer)
}
writer.write("</$name>")
} else {
writer.write("/>")
}
}
}
def nodes
Writer writer
MyBuilderSupport(Writer writer) {
nodes = [:]
this.writer = writer
}
@Override
protected void setParent(Object parent, Object child) {
}
@Override
protected void nodeCompleted(Object parent, Object node) {
super.nodeCompleted(parent, node)
def currentNode = nodes[node]
if(parent) {
nodes[parent].children << currentNode
} else {
//构建需要的格式
currentNode.build(writer)
}
}
@Override
protected Object createNode(Object name) {
return createNode(name,null,null)
}
@Override
protected Object createNode(Object name, Object value) {
return createNode(name,null,value)
}
@Override
protected Object createNode(Object name, Map map) {
return createNode(name,map,null)
}
@Override
protected Object createNode(Object name, Map attributes, Object value) {
nodes.put(name,new Node(name,value,attributes))
return name
}
}
MyBuilderSupportTest.groovy
package main.groovy.L12.builder
StringWriter sw = new StringWriter()
def builder = new MyBuilderSupport(sw)
builder.html {
head("head",key:'value')
body {
}
}
println sw
输出
<html><head key='value' >head</head><body/></html>
五.自定义FactoryBuilderSupport(SwingBuilder继承该类)
MyFactoryBuilderSupport.groovy
package main.groovy.L12.builder
class Node{
String name
String value
Map attr
def children
Node(String name, String value, Map attr) {
this.name = name
this.value = value
this.attr = attr
children = []
}
//<xml key='value'/>
//<xml >xxx</xml>
def build(Writer writer){
writer.write("<$name")
if (attr){
attr.each {
key,value->
writer.write(" $key='$value'")
}
}
if (value || children){
writer.write(">")
if (value){
writer.write(value)
}
children.each{
it.build(writer)
}
writer.write("</$name>")
}else{
writer.write("/>")
}
}
}
//工厂 buildersupport工厂
class MyFactoryBuilderSupport extends FactoryBuilderSupport {
{
//注册html的工厂
registerFactory('html',new HtmlFactory())
registerFactory('head',new HeadFactory())
}
}
class HtmlFactory extends AbstractFactory{
def name
@Override
Object newInstance(FactoryBuilderSupport builder, Object name, Object value, Map attributes) throws InstantiationException, IllegalAccessException {
println "newInstance $name $value $attributes"
this.name = name
return new Node(name,value,attributes)
}
/**
* 处理属性的方法
*/
@Override
boolean onHandleNodeAttributes(FactoryBuilderSupport builder, Object node, Map attributes) {
//如果返回true会从newInstance返回中寻找attributes对应key的属性
return false
}
// false表示可以接收闭包
//true 表示不能接收
@Override
boolean isLeaf() {
return super.isLeaf()
}
/**
* 设置当前节点的父节点
* @param builder
* @param parent
* @param child
*/
@Override
void setParent(FactoryBuilderSupport builder, Object parent, Object child) {
super.setParent(builder, parent, child)
println "$name setParent ${parent.name} ${child.name}"
}
/**
* 设置当前节点的子节点
* @param builder
* @param parent
* @param child
*/
@Override
void setChild(FactoryBuilderSupport builder, Object parent, Object child) {
super.setChild(builder, parent, child)
println "$name setChild ${parent.name} ${child.name}"
parent.children << child
}
}
class HeadFactory extends AbstractFactory{
def name
@Override
Object newInstance(FactoryBuilderSupport builder, Object name, Object value, Map attributes) throws InstantiationException, IllegalAccessException {
println "newInstance $name $value $attributes"
this.name = name
return new Node(name,value,attributes)
}
/**
* 处理属性的方法
*/
@Override
boolean onHandleNodeAttributes(FactoryBuilderSupport builder, Object node, Map attributes) {
//如果返回true会从newInstance返回中寻找attributes对应key的属性
return false
}
// false表示可以接收闭包
//true 表示不能接收
@Override
boolean isLeaf() {
return super.isLeaf()
}
@Override
void setParent(FactoryBuilderSupport builder, Object parent, Object child) {
super.setParent(builder, parent, child)
println "$name setParent ${parent.name} ${child.name}"
}
@Override
void setChild(FactoryBuilderSupport builder, Object parent, Object child) {
super.setChild(builder, parent, child)
println "$name setChild ${parent.name} ${child.name}"
}
}
MyFactoryBuilderSupportTest.groovy
package main.groovy.L12.builder
StringWriter sw = new StringWriter()
new MyFactoryBuilderSupport().html{
head('head',key:'value'){
}
}.build(sw)
println sw
输出
newInstance html null [:]
newInstance head head [key:value]
head setParent html head
html setChild html head
<html><head key='value'>head</head></html>
网友评论