Groovy XML 处理
Groovy 分别使用 MarkupBuilder、XMLParser 来进行XML标记的构建和解析;
构建XML标记
如需要创建以下的XML树:
<studentList createDate='2017-9-20'>
<student>
<id>26317837</id>
<name>assad</name>
<age>20</age>
<city>Guangzhou</city>
</student>
</StudentList>
创建代码如下,
构建XML树对象,并保存到文件;:
class CreateAndSave {
static void main(String[] args){
def builder = new MarkupBuilder(new PrintWriter("./studentList.xml"));
//def builder = new MarkupBuilder(); 空参数会直接将XML树打印到标准输出
//直接生成字符串 def build = newMarkupBuilder(strings); println string;
builder.studentList(createDate:'2017-9-20'){
student{
id('26317837')
name('assad')
age('20')
city('Guangzhou')
}
}
}
}
以上 MarkupBuilder 用于创建一个XML树构造器对象,builder 使用 . 连接一个节点(后添加的节点会依据前面节点的规则而决定所处的位置),每一个节点后的(attribute:'value')用于定义该节点的属性,('value')用于定义该节点的值,{ }内用于定义该节点的子节点;
如果要实现批量创建节点,类似以下的XML树,可以采用类似如下的方式:
<studentList createDate='2017-9-20'>
<student>
<id>1263781</id>
<name>assad</name>
<age>20</age>
<city>Guangzhou</city>
</student>
<student>
<id>3729321</id>
<name>Kim</name>
<age>21</age>
<city>Shenzhen</city>
</student>
<student>
<id>3729329</id>
<name>Vency</name>
<age>22</age>
<city>Shanghai</city>
</student>
</studentList>
CreateAndSave.groovy
class CreateAndSave {
static void main(String[] args){
//储存student数据
def students = [ ['1263781','assad','20','Guangzhou'],
['3729321','Kim','21','Shenzhen'],
['3729329','Vency','22','Shanghai'] ];
def builder2 = new MarkupBuilder(new PrintWriter('./studentList2.xml'));
//构建XML树
builder2.studentList(createDate:'2017-9-20'){
students.each{ //迭代添加 <student> 节点
element -> builder2.student{
id(element[0])
name(element[1])
age(element[2])
city(element[3])
}
}
}
}
}
解析XML标记
Groovy 使用 XMLParse 类来解析 XML 文件,解析后产生一个XML对象,对于该 XML 树中的元素和属性遍历语法,同 xpath 语法;
以下示例读取解析以上的 studentList2.xml 文件:
class ParseXML {
static void main(String[] args){
//创建XmlParseer文件,并解析文件,doc对象即为"studentList2.xml"的根节点
def parser = new XmlParser();
def doc = parser.parse("./studentList2.xml");
//解析字符串 def doc = parser.parseText(xmlstring);
//获取第1个 <student> 的 <name> 内容
def name = doc.student[0].name[0].text(); //output:assad
//获取 <studentList> 的 createDate 属性
def createDate = doc['@createDate']; //output: 2017-9-20
//遍历答应所有<student>信息
doc.student.each{ element ->
println("student: ${element.id[0].text()}, ${element.name[0].text()}, ${element.age[0].text()}, ${element.city[0].text()}");
}
/*output:
student: 1263781, assad, 20, Guangzhou
student: 3729321, Kim, 21, Shenzhen
student: 3729329, Vency, 22, Shanghai
*/
//可以使用遍历器遍历Node的所有子节点
def iter = doc.iterator();
//获取节点名称和值
node.text();
node.name();
}
}
对于XML的构建还可以使用Groovy构造器的语法,详见:
http://blog.youkuaiyun.com/al_assad/article/details/78044572