美文网首页
Json、xml、swing

Json、xml、swing

作者: lv_mock | 来源:发表于2020-09-23 17:34 被阅读0次

一.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)

输出,在左上角弹出框

1600853565(1).jpg

四.自定义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>

相关文章

网友评论

      本文标题:Json、xml、swing

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