`

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

相关推荐

    Groovy 介绍 官网资源

    - **使用Soot优化Groovy字节码**:介绍了如何使用Soot工具优化Groovy生成的字节码。 #### 三、Groovy社区和贡献指南 Groovy不仅拥有强大的官方支持,还有活跃的社区。Groovy官方网站还提供了以下资源: - **社区...

    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来生成验证码...

    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