Groovy 把使用 XML 的美妙和简易性推向了极致,这就是 GroovyMarkup,它不仅简化了 SAX、DOM 操作,并且把这一理念引入到了 Swing、Swt 界面绘制领域中,Ant、Maven 构建脚本生成中;甚至铺散到更广阔的领域。
- groovy.xml.MarkupBuilder -- 将你的对象序列化成 XML 或 XHTML
- groovy.xml.SAXBuilder -- 可以用于现有的 SAX 处理器
- groovy.xml.DOMBuilder -- 创建并解析 DOM 文档
- groovy.util.AntBuilder -- 用来创建 Ant 构建文件
- groovy.swing.SwingBuilder -- 用来创建 Swing 用户界面
- groovy.util.NodeBuilder -- 创建一般的任意对象的树状结构
构建xml
def sw = new StringWriter();
def xml = new groovy.xml.MarkupBuilder(sw)
xml.langs(type:"current"){
language(version:"1.6", flavor:"static", "java")
language(version:"1.7", "groovy")
language(version:"4", "javascript")
}
println sw
生成内容如下:
<langs type='current'>
<language version='1.6' flavor='static'>java</language>
<language version='1.7'>groovy</language>
<language version='4'>javascript</language>
</langs>
1. MarkupBuilder 的默认构造是输出到控制台,还可以接受其他的参数 IndentPrinter、PrintWriter、Writer,分别指明了不同的输出目的地。所以你可以此控制输出到 Socket 上,或是 Groovlet 的网页上等。
2. MarkupBuilder 的方法名是想当然的,如这里的 langs()、language() 方法,它们会生成同名的标签。
3. 闭包中的方法生成为外层方法(标签) 的子标签,例如,上面的 language() 生成了 langs() 对应标签 <langs> 的子标签 <language>
通过 MarkupBuilder 构建 HTML
import groovy.xml.MarkupBuilder
def html = new MarkupBuilder()
html.html{
head{
title("Links")
}
body{
h1("Here are my html bookmarks")
table(border:"1"){
tr{
th("what")
th("where")
}
tr{
td("groovy articles")
td{
a(href:"http://ibm.com/developerworks", "DeveloperWorks")
}
}
}
}
}
MarkupBuilder 非常适合用于同步构建简单的 XML 文档。对于更加高级的 XML 创建,Groovy 提供了一个
StreamingMarkupBuilder。通过它,您可以添加各种各样的 XML 内容,比如说处理指令、名称空间和使用 mkp 帮助对象的未转义文本(非常适合 CDATA 块)
def comment = "<![CDATA[<!-- address is new to this release -->]]>"
def builder = new groovy.xml.StreamingMarkupBuilder()
builder.encoding = "UTF-8"
def person = {
mkp.xmlDeclaration()
mkp.pi("xml-stylesheet": "type='text/xsl' href='myfile.xslt'" )
mkp.declareNamespace('':'http://myDefaultNamespace')
mkp.declareNamespace('location':'http://someOtherNamespace')
person(id:100){
firstname("Jane")
lastname("Doe")
mkp.yieldUnescaped(comment)
location.address("123 Main")
}
}
def writer = new FileWriter("person.xml")
writer << builder.bind(person)
解析XML文件
<lang type="current">
<language>java</language>
<language>groovy</language>
<language>javascript</language>
</lang>
def langs = new XmlParser().parse("language.xml")
println "type = ${langs.attribute("type")}"
langs.language.each{
println it.text()
}
解析字符串变量XML
def xml = """
<langs type='current' count='3' mainstream='true'>
<language flavor='static' version='1.5'>Java</language>
<language flavor='dynamic' version='1.6.0'>Groovy</language>
<language flavor='dynamic' version='1.9'>JavaScript</language>
</langs>
"""
def langs = new XmlParser().parseText(xml)
println "type = ${langs.attribute("type")}"
langs.language.each{
println it.text()
}
println langs.getClass() // class groovy.util.Node 继承自ArrayList
println langs
println langs.attributes().each{
println "-" * 15
println it.key
println it.value
}
def results = []
langs.language.each{
results << it.text()
}
println results
def version = langs.language*.attribute("version")
println version
XmlParser 返回 Node 和 NodeList,
XmlSlurper 返回一个 groovy.util.slurpersupport.GPathResult,不用调用attribute() text(),直接操作元素
def langs = new XmlSlurper().parseText(xml)
println langs.@count
langs.language.each{
println it
}
groovy.util.
NodeBuilder,用来创建一般任意对象的树状结构。看到了,它不在 groovy.xml 包之下,但它是一个 Builder,所以秉承了 Builder 的语法规则,而且还可用路径(对象导航)的方式来访问这个 Builder 实例中的节点或属性值。
import groovy.util.NodeBuilder;
someBuilder = new NodeBuilder(); //只有这么一个构建方法
root = someBuilder.users([balance:100]){ //这一块的语法完全同 MarkupBuilder
user([gender:"male"],"xace");
user("Joe"){
order(item:"Book");
}
}
// 因为 NodeBuilder 不预示着输出,所以需要显示的 print
println root;
println("-----访问节点-----");
// get() 方法返回包含指定名称的所有子节点
// 就像 DOM 的 getElementsByTagName("user")
users = root.get("user");
// 用路径(导航)的方式访问节点 同users = root.user
users.each(){
//用 name() 和 value() 分别访问节点的名称和值
println "${it.name()}:${it.value()}";
}
println("-----访问属性-----");
// attributes() 方法返回节点属性的一个 Map
println root.attribute("balance");
println root.@balance;
println("-----深度优先遍历节点-----");
root.depthFirst().each(){
println "${it.name()}:${it.attributes()}";
}
println("-----广度优先遍历节点-----");
root.breadthFirst().each(){
println "${it.name()}:${it.value()}";
}
println("用 Java 迭代器来遍历一个节点的子节点");
it = root.iterator();
while(it.hasNext()){
println it.next();
}
分享到:
相关推荐
- **使用Soot优化Groovy字节码**:介绍了如何使用Soot工具优化Groovy生成的字节码。 #### 三、Groovy社区和贡献指南 Groovy不仅拥有强大的官方支持,还有活跃的社区。Groovy官方网站还提供了以下资源: - **社区...
XML(eXtensible Markup Language)则是一种结构化标记语言,常用于存储和传输数据。在Android开发中,两者都被广泛用于网络通信。 使用Volley获取JSON数据的基本步骤如下: 1. **添加依赖**:在项目的build....
XML(eXtensible Markup Language)是一种标记语言,通过标签(Tags)定义元素(Elements),元素之间可以嵌套,形成层次结构。每个元素可以有属性(Attributes)和内容(Content)。XML文件也遵循特定的语法规则,...
XML(Extensible Markup Language)是一种用于标记数据的语言,广泛应用于数据交换、配置文件等领域。而Java作为一种面向对象的编程语言,常用于构建复杂的应用系统。将XML数据转换为Java对象,能够方便地在两者之间...
XML(eXtensible Markup Language)是一种标记语言,广泛用于数据交换和文档存储。在Java中,处理XML的库有很多,其中Dom4j是一个功能强大且灵活的库,它提供了对XML的全面支持,包括读取、写入、修改以及XPath查询...
XML(eXtensible Markup Language)是一种用于存储和传输数据的标记语言,广泛应用于Web服务、配置文件和数据交换等领域。JDOM是Java中处理XML的一种库,它提供了一种高效且易于使用的API来创建、读取和修改XML文档...
JCaptcha4Struts2 是一个 Struts2的插件,用来增加验证码的支持,使用时只需要用一个 JSP 标签 (<jcaptcha:image label="Type the text "/> ) 即可,直接在 struts.xml 中进行配置,使用强大的 JCaptcha来生成验证码...
Apache Commons包中的一个,通过它可以很方便的解析xml文件生成java对象 aspectjrt.jar 和aspectjweaver.jar Annotation 方式实现 AOP commons-dbcp.jar commons-pool-1.2.jar DBCP数据库连接池 cglib-nodep-2.1_...
JasperReports 使用 JRXML 文件格式进行报表设计,这是一种基于XML的标记语言,允许开发者通过IReport或Jaspersoft Studio等可视化设计工具创建复杂的报表布局。5.6.0 版本增加了更多图表类型和自定义样式选项,...
4.12 默认表达式(Elvis operator):类似Groovy语言中的安全导航操作符。 4.13 哑操作符号:用于生成不会被转义的输出。 4.14 预处理:在最终渲染之前处理模板内容。 4.15 数据类型转换与格式化:允许在模板中转换...
JCaptcha4Struts2 是一个 Struts2的插件,用来增加验证码的支持,使用时只需要用一个 JSP 标签 (<jcaptcha:image label="Type the text "/> ) 即可,直接在 struts.xml 中进行配置,使用强大的 JCaptcha来生成验证码...
JCaptcha4Struts2 是一个 Struts2的插件,用来增加验证码的支持,使用时只需要用一个 JSP 标签 (<jcaptcha:image label="Type the text "/> ) 即可,直接在 struts.xml 中进行配置,使用强大的 JCaptcha来生成验证码...
JCaptcha4Struts2 是一个 Struts2的插件,用来增加验证码的支持,使用时只需要用一个 JSP 标签 (<jcaptcha:image label="Type the text "/> ) 即可,直接在 struts.xml 中进行配置,使用强大的 JCaptcha来生成验证码...
JCaptcha4Struts2 是一个 Struts2的插件,用来增加验证码的支持,使用时只需要用一个 JSP 标签 (<jcaptcha:image label="Type the text "/> ) 即可,直接在 struts.xml 中进行配置,使用强大的 JCaptcha来生成验证码...
JCaptcha4Struts2 是一个 Struts2的插件,用来增加验证码的支持,使用时只需要用一个 JSP 标签 (<jcaptcha:image label="Type the text "/> ) 即可,直接在 struts.xml 中进行配置,使用强大的 JCaptcha来生成验证码...
JCaptcha4Struts2 是一个 Struts2的插件,用来增加验证码的支持,使用时只需要用一个 JSP 标签 (<jcaptcha:image label="Type the text "/> ) 即可,直接在 struts.xml 中进行配置,使用强大的 JCaptcha来生成验证码...
JCaptcha4Struts2 是一个 Struts2的插件,用来增加验证码的支持,使用时只需要用一个 JSP 标签 (<jcaptcha:image label="Type the text "/> ) 即可,直接在 struts.xml 中进行配置,使用强大的 JCaptcha来生成验证码...
JCaptcha4Struts2 是一个 Struts2的插件,用来增加验证码的支持,使用时只需要用一个 JSP 标签 (<jcaptcha:image label="Type the text "/> ) 即可,直接在 struts.xml 中进行配置,使用强大的 JCaptcha来生成验证码...
JCaptcha4Struts2 是一个 Struts2的插件,用来增加验证码的支持,使用时只需要用一个 JSP 标签 (<jcaptcha:image label="Type the text "/> ) 即可,直接在 struts.xml 中进行配置,使用强大的 JCaptcha来生成验证码...