1       标签:xml或者html

1.1  使用XmlSlurper解析xml

groovy处理xml非常容易。XmlSlurper 类用来处理xml。在处理xml方面,还有其他的处理方式,但是XmlSlurper 处理效率更加的高效,并且灵活性很好。

XmlSlurper 执行parseText后返回GPathResult 对象。能够使用GPath 表达式来访问xml树中的各个层级节点。

用点(.)来读取需要的子节点,并且使用@读取属性值。

package xml

class XmlSlurperTest {

static main(args) {

def xmldocument='''

<persons>

<person age="3">

<name>

<firstname sex="男">zuoys</firstname>

<lastname>yaoyuan2</lastname>

</name>

</person>

<person age="4">

<name>

<firstname>yang</firstname>

<lastname>jack</lastname>

</name>

</person>

</persons>

''';

//解析并读取该xml

def persons = new XmlSlurper().parseText(xmldocument);

/**

* 当然,也可以从一个磁盘中的文件中读取,如

* def persons = new XmlSlurper().parse(new File('data/plan.xml'))

*/

def allRecords = persons.person.size();

println("xml文档中person的数量是:$allRecords");

def person = persons.person[0];

println("person'name下的所有元素(不含属性)的值:${person.name}");

for (p in persons.person) {

println("${p.name.firstname.text()},${p.name.lastname.text()} 是 ${p.@age} 岁");

}

}

}

输出

xml文档中person的数量是:2

person'name下的所有值:zuoysyaoyuan2

zuoys,yaoyuan2 是 3 岁

yang,jack 是 4 岁

1.2  使用MarkupTemplateEngine生成标签

在Groovy2.3中,MarkupTemplateEngine 支持生成类似xml的标记(XML, XHTML, HTML5等),但是,其通常被用来生成任意的文本。

静态编译非常快,并且支持国际化,同时也支持模板(template)。

package xml

import groovy.text.markup.MarkupTemplateEngine

import groovy.text.markup.TemplateConfiguration

import template.Task

class MarkupTemplateEngineTest {

static main(args) {

String xml_template = '''xmlDeclaration()

tasks {

tasks.each {

task (summary:it.summary,duration:it.duration);

};

};

''';

String html_template='''

yieldUnescaped '<!DOCTYPE html>';

html(lang:'en') {

head {

meta('http-equiv':'"Content-Type" content="text/html; charset=utf-8"');

title('My page');

};

body {

p('这是一个html例子');

};

};

''';

def values = [tasks:[

new Task(summary:"java",duration:4),

new Task(summary:"groovy",duration:12)

]

];

TemplateConfiguration config = new TemplateConfiguration();

def engine = new MarkupTemplateEngine(config);

def template1 = engine.createTemplate(xml_template);

def template2 = engine.createTemplate(html_template);

println("===xml输出:");

println template1.make(values);

println("===html输出:");

println template2.make(values);

}

}

输出

===xml输出:

<?xml version='1.0'?>

<tasks><task summary='java' duration='4'/><task summary='groovy' duration='12'/></tasks>

===html输出:

<!DOCTYPE html><html lang='en'><head><meta http-equiv='"Content-Type" content="text/html; charset=utf-8"'/><title>My page</title></head><body><p>这是一个html例子</p></body></html>

Templates support includes.

1.3  使用MarkupBuilder创建标签(xml)文件

MarkupBuilder 是一个很老的builder,例子如下:

package xml

import groovy.xml.MarkupBuilder

/**

* 生产xml

* @author zuoys

*

*/

class MarkupWriter {

static main(args) {

def date = new Date();

StringWriter writer = new StringWriter();

MarkupBuilder builder = new MarkupBuilder(writer);

builder.tasks {

for (i in 1..3) {

task {

summary(value:"Test $i");

description(value:"Description $i");

duedate(value:"${date.format('yyyy-MM-dd')}");

};

}

};

println(writer.toString());

}

}

输出

<tasks>

<task>

<summary value='Test 1' />

<description value='Description 1' />

<duedate value='2016-07-24' />

</task>

<task>

<summary value='Test 2' />

<description value='Description 2' />

<duedate value='2016-07-24' />

</task>

<task>

<summary value='Test 3' />

<description value='Description 3' />

<duedate value='2016-07-24' />

</task>

</tasks>

builder.tasks {:生成父节点。

task {生成二级子节点。

summary(value:"Test $i");:使用构造方法来创建子节点。

使用MarkupBuilder时,这些都是在运行时构建的。

也可以使用map,如下:

package xml

import groovy.xml.MarkupBuilder

class MarkupWriterMap {

static main(args) {

Map map = [zuo:"zuoys",yang:"yangyang"];

def date = new Date();

StringWriter writer = new StringWriter();

MarkupBuilder builder = new MarkupBuilder(writer);

builder.tasks {

map.each {key,myvalue ->

person {

firstname(value:"$key");

lastname(value:"$myvalue");

};

};

};

println(writer.toString());

}

}

输出

<tasks>

<person>

<firstname value='zuo' />

<lastname value='zuoys' />

</person>

<person>

<firstname value='yang' />

<lastname value='yangyang' />

</person>

</tasks>

也可以使用builder来创建合法的html。

package xml

import groovy.xml.MarkupBuilder

class MarkupHtml {

static main(args) {

Map map = [zuo:"zuoys",yang:"yangyang"];

def date = new Date();

StringWriter writer = new StringWriter();

MarkupBuilder builder = new MarkupBuilder(writer);

builder.html {

head {

title("yaoyuan2.com");

};

body {

div (class:"strike");

p ("this is line");

};

};

println(writer.toString());

}

}

输出

<html>

<head>

<title>yaoyuan2.com</title>

</head>

<body>

<div class='strike' />

<p>this is line</p>

</body>

</html>

19 标签:xml或者html的更多相关文章

  1. Jersey(1.19.1) - XML Support

    As you probably already know, Jersey uses MessageBodyWriters and MessageBodyReaders to parse incomin ...

  2. tomcat与springmvc 结合 之---第19篇(下,补充) springmvc 加载.xml文件的bean标签的过程

    writedby 张艳涛,上一篇写了springmvc对<mvc:annoXXXX/>标签的解析过程,其实是遗漏重要的细节,因为理解的不深入吧 今天接着解析<bean>标签 & ...

  3. 读取只包含标签的xml

    什么是XML XML是可扩展标记语言(Extensible Markup Language)的缩写,其中标记是关键部分.用户可以创建内容,然后使用限定标记标记它,从而使每个单词.短语或块成为可识别.可 ...

  4. tomcat与springmvc 结合 之---第19篇 springmvc 加载.xml文件的bean 过程

    writedby 张艳涛,看springmvc 的源码太难了,怎么办, 这篇文章主要分析了看透springmvc的第9章结尾的 如何解析xml 命名空间标签 <?xml version=&quo ...

  5. 转:在java中使用dom4j解析xml

    JAVA 使用Dom4j 解析XML Java DOM4J Parser - Parse XML Document Dom4j下载及使用Dom4j读写XML简介 在java中使用dom4j解析xml ...

  6. javaweb学习总结(二十七)——jsp简单标签开发案例和打包

    一.开发标签库 1.1.开发防盗链标签 1.编写标签处理器类:RefererTag.java 1 package me.gacl.web.simpletag; 2 3 import java.io.I ...

  7. 9.XML文件解析

    一.XML简介 XML(EXtensible Markup Language),可扩展标记语言 特点:XML与操作系统.编程语言的开发平台无关 实现不同系统之间的数据交换 作用:数据交互 配置应用程序 ...

  8. Java是如何解析xml文件的(DOM)

    Java解析xml文件 在Java程序中读取xml文件的过程也称为"解析xml文件": 解析的目的: 获取 节点名和节点值 获取 属性名.属性值. 四中解析方式: DOM SAX ...

  9. 第70节:Java中xml和tomcat

    第70节:Java中xml和tomcat 前言: 哭着也要看完,字数: jdbc crud - statement dao java.sql.Driver The interface that eve ...

随机推荐

  1. Looksery Cup 2015 C. The Game Of Parity —— 博弈

    题目链接:http://codeforces.com/problemset/problem/549/C C. The Game Of Parity time limit per test 1 seco ...

  2. haproxy参数解析

    HAProxy工作于隧道模式,其仅检查每一个连接的第一个请求, 1. option abortonclose #当服务器负载过高时,将自动关闭队列中处理时间较长的连接请求 2. option http ...

  3. codeforces 31C Schedule 解题报告

    题目链接:http://codeforces.com/problemset/problem/31/C 题目意思:给出 n 个 lessons 你,每个lesson 有对应的 起始和结束时间.问通过删除 ...

  4. 盈创动力之 JS校验方法

    var IS_NULL = 128; // 10000000var IS_FULL = 64; // 01000000var IS_HALF = 32; // 00100000var IS_ASCII ...

  5. linux下syslog使用说明

    转自:http://blog.chinaunix.net/uid-25120309-id-3359929.html syslog 系统日志应用  1) 概述       syslog是Linux系统默 ...

  6. kitti 数据集解析

    1.KITTI数据集采集平台: KITTI数据采集平台包括2个灰度摄像机,2个彩色摄像机,一个Velodyne 3D激光雷达,4个光学镜头,以及1个GPS导航系统.坐标系转换原理参见click.KIT ...

  7. c++之函数值传递和引用传递解析----关键在于理解函数return的实现机制(内存分配)

    函数调用过程解析 func里的a存储在调用fun函数时开辟的栈空间里,这块栈只在调用func时对func可用,调用结束后返回的a,其实是暂存在寄存器里的(一般情况下是eax),而返回到main里时,m ...

  8. Flutter实战视频-移动电商-17.首页_楼层组件的编写技巧

    17.首页_楼层组件的编写技巧 博客地址: https://jspang.com/post/FlutterShop.html#toc-b50 楼层的效果: 标题 stlessW快速生成: 接收一个St ...

  9. POJ 1182 食物链 (破题)

    题意:中文题. 析:对POJ 真是无语,有的题用G++过不了,C++能过,有的题不写EOF(题目明明说就一组的数据的)不过,有的题写EOF也不过, 这个题就是写EOF就过不了... 这个题用的是加权并 ...

  10. UVa 10214 Trees in a Wood. (数论-欧拉函数)

    题意:给定一个abs(x) <= a, abs(y) <= b,除了原点之外的整点各有一棵树,可以相互阻挡,求从原点可以看到多少棵树. 析:由于a < b,所以我们可以一列一列的统计 ...