`

Groovy解析生成标记语言XML HTML

阅读更多
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();
}
分享到:
评论

相关推荐

    Volley获取json和xml数据解析显示

    XML(eXtensible Markup Language)则是一种结构化标记语言,常用于存储和传输数据。在Android开发中,两者都被广泛用于网络通信。 使用Volley获取JSON数据的基本步骤如下: 1. **添加依赖**:在项目的build....

    androidDom4J解析xml

    XML(eXtensible Markup Language)是一种标记语言,通过标签(Tags)定义元素(Elements),元素之间可以嵌套,形成层次结构。每个元素可以有属性(Attributes)和内容(Content)。XML文件也遵循特定的语法规则,...

    XML转换为JAVA对象的方法

    XML(Extensible Markup Language)是一种用于标记数据的语言,广泛应用于数据交换、配置文件等领域。而Java作为一种面向对象的编程语言,常用于构建复杂的应用系统。将XML数据转换为Java对象,能够方便地在两者之间...

    Dom4j封装和解析

    XML(eXtensible Markup Language)是一种标记语言,广泛用于数据交换和文档存储。在Java中,处理XML的库有很多,其中Dom4j是一个功能强大且灵活的库,它提供了对XML的全面支持,包括读取、写入、修改以及XPath查询...

    jdom读写xml说明

    XML(eXtensible Markup Language)是一种用于存储和传输数据的标记语言,广泛应用于Web服务、配置文件和数据交换等领域。JDOM是Java中处理XML的一种库,它提供了一种高效且易于使用的API来创建、读取和修改XML文档...

    java开源包7

    JCaptcha4Struts2 是一个 Struts2的插件,用来增加验证码的支持,使用时只需要用一个 JSP 标签 (&lt;jcaptcha:image label="Type the text "/&gt; ) 即可,直接在 struts.xml 中进行配置,使用强大的 JCaptcha来生成验证码...

    java开发常用jar包

    Apache Commons包中的一个,通过它可以很方便的解析xml文件生成java对象 aspectjrt.jar 和aspectjweaver.jar Annotation 方式实现 AOP commons-dbcp.jar commons-pool-1.2.jar DBCP数据库连接池 cglib-nodep-2.1_...

    Jasperreports5.6.0 dist

    JasperReports 使用 JRXML 文件格式进行报表设计,这是一种基于XML的标记语言,允许开发者通过IReport或Jaspersoft Studio等可视化设计工具创建复杂的报表布局。5.6.0 版本增加了更多图表类型和自定义样式选项,...

    thymeleaf_3.0.5_中文参考手册.pdf

    4.12 默认表达式(Elvis operator):类似Groovy语言中的安全导航操作符。 4.13 哑操作符号:用于生成不会被转义的输出。 4.14 预处理:在最终渲染之前处理模板内容。 4.15 数据类型转换与格式化:允许在模板中转换...

    java开源包1

    JCaptcha4Struts2 是一个 Struts2的插件,用来增加验证码的支持,使用时只需要用一个 JSP 标签 (&lt;jcaptcha:image label="Type the text "/&gt; ) 即可,直接在 struts.xml 中进行配置,使用强大的 JCaptcha来生成验证码...

    java开源包11

    JCaptcha4Struts2 是一个 Struts2的插件,用来增加验证码的支持,使用时只需要用一个 JSP 标签 (&lt;jcaptcha:image label="Type the text "/&gt; ) 即可,直接在 struts.xml 中进行配置,使用强大的 JCaptcha来生成验证码...

    java开源包2

    JCaptcha4Struts2 是一个 Struts2的插件,用来增加验证码的支持,使用时只需要用一个 JSP 标签 (&lt;jcaptcha:image label="Type the text "/&gt; ) 即可,直接在 struts.xml 中进行配置,使用强大的 JCaptcha来生成验证码...

    java开源包3

    JCaptcha4Struts2 是一个 Struts2的插件,用来增加验证码的支持,使用时只需要用一个 JSP 标签 (&lt;jcaptcha:image label="Type the text "/&gt; ) 即可,直接在 struts.xml 中进行配置,使用强大的 JCaptcha来生成验证码...

    Maven权威指南 很精典的学习教程,比ANT更好用

    站点生成和报告 (Site Generation and Reporting) 3.6. 小结 4. 定制一个Maven项目 4.1. 介绍 4.1.1. 下载本章样例 4.2. 定义Simple Weather项目 4.2.1. Yahoo! Weather RSS 4.3. 创建Simple Weather...

    java开源包6

    JCaptcha4Struts2 是一个 Struts2的插件,用来增加验证码的支持,使用时只需要用一个 JSP 标签 (&lt;jcaptcha:image label="Type the text "/&gt; ) 即可,直接在 struts.xml 中进行配置,使用强大的 JCaptcha来生成验证码...

    java开源包5

    JCaptcha4Struts2 是一个 Struts2的插件,用来增加验证码的支持,使用时只需要用一个 JSP 标签 (&lt;jcaptcha:image label="Type the text "/&gt; ) 即可,直接在 struts.xml 中进行配置,使用强大的 JCaptcha来生成验证码...

    java开源包10

    JCaptcha4Struts2 是一个 Struts2的插件,用来增加验证码的支持,使用时只需要用一个 JSP 标签 (&lt;jcaptcha:image label="Type the text "/&gt; ) 即可,直接在 struts.xml 中进行配置,使用强大的 JCaptcha来生成验证码...

    java开源包4

    JCaptcha4Struts2 是一个 Struts2的插件,用来增加验证码的支持,使用时只需要用一个 JSP 标签 (&lt;jcaptcha:image label="Type the text "/&gt; ) 即可,直接在 struts.xml 中进行配置,使用强大的 JCaptcha来生成验证码...

    java开源包8

    JCaptcha4Struts2 是一个 Struts2的插件,用来增加验证码的支持,使用时只需要用一个 JSP 标签 (&lt;jcaptcha:image label="Type the text "/&gt; ) 即可,直接在 struts.xml 中进行配置,使用强大的 JCaptcha来生成验证码...

Global site tag (gtag.js) - Google Analytics