您的位置:首页 > 编程语言 > Java开发

JAVA 使用Dom4j 解析XML

2015-10-19 00:00 405 查看
解析XML的方式有很多,本文介绍使用dom4j解析xml。

1、环境准备

(1)下载dom4j-1.6.1.jar

(2)下载junit-4.10.jar

2、温馨提示

解析XML过程是通过获取Document对象,然后继续获取各个节点以及属性等操作,因此获取Document对象是第一步,大体说来,有三种方式:

(1)自己创建Document对象

[java] view plaincopyprint?





Document document = DocumentHelper.createDocument();

Element root = document.addElement("students");

其中students是根节点,可以继续添加其他节点等操作。

(2)读取XML文件获取Document对象

[java] view plaincopyprint?





//创建SAXReader对象

SAXReader reader = new SAXReader();

//读取文件 转换成Document

Document document = reader.read(new File("XXXX.xml"));

(3)读取XML文本内容获取Document对象

[java] view plaincopyprint?





String xmlStr = "<students>......</students>";

Document document = DocumentHelper.parseText(xmlStr);

3、示例

(1)xml文件内容如下

[html] view plaincopyprint?





<?xml version="1.0" encoding="UTF-8"?>

<students>

<student1 id="001">

<微信公众号>@残缺的孤独</微信公众号>

<学号>20140101</学号>

<地址>北京海淀区</地址>

<座右铭>要么强大,要么听话</座右铭>

</student1>

<student2 id="002">

<新浪微博>@残缺的孤独</新浪微博>

<学号>20140102</学号>

<地址>北京朝阳区</地址>

<座右铭>在哭泣中学会坚强</座右铭>

</student2>

</students>

(2)解析过程

[java] view plaincopyprint?





package cn.com.yy.dom4j;

import java.io.File;

import java.util.Iterator;

import java.util.List;

import org.dom4j.Attribute;

import org.dom4j.Document;

import org.dom4j.Element;

import org.dom4j.io.SAXReader;

import org.junit.Test;

public class Dom4JforXML {

@Test

public void test() throws Exception{

//创建SAXReader对象

SAXReader reader = new SAXReader();

//读取文件 转换成Document

Document document = reader.read(new File("src/cn/com/yy/dom4j/s.xml"));

//获取根节点元素对象

Element root = document.getRootElement();

//遍历

listNodes(root);

}

//遍历当前节点下的所有节点

public void listNodes(Element node){

System.out.println("当前节点的名称:" + node.getName());

//首先获取当前节点的所有属性节点

List<Attribute> list = node.attributes();

//遍历属性节点

for(Attribute attribute : list){

System.out.println("属性"+attribute.getName() +":" + attribute.getValue());

}

//如果当前节点内容不为空,则输出

if(!(node.getTextTrim().equals(""))){

System.out.println( node.getName() + ":" + node.getText());

}

//同时迭代当前节点下面的所有子节点

//使用递归

Iterator<Element> iterator = node.elementIterator();

while(iterator.hasNext()){

Element e = iterator.next();

listNodes(e);

}

}

}

(3)解析结果

[html] view plaincopyprint?





当前节点的名称:students

当前节点的名称:student1

属性id:001

当前节点的名称:微信公众号

微信公众号:@残缺的孤独

当前节点的名称:学号

学号:20140101

当前节点的名称:地址

地址:北京海淀区

当前节点的名称:座右铭

座右铭:要么强大,要么听话

当前节点的名称:student2

属性id:002

当前节点的名称:新浪微博

新浪微博:@残缺的孤独

当前节点的名称:学号

学号:20140102

当前节点的名称:地址

地址:北京朝阳区

当前节点的名称:座右铭

座右铭:在哭泣中学会坚强

4、dom4j操作节点属性

使用dom4j可以操作节点属性,比如添加节点属性、删除节点属性、修改属性值等操作。下面使用dom4j为上述的student1节点删除id属性,新添name属性。

(1)代码示例

[java] view plaincopyprint?





@Test

public void test2()throws Exception{

//创建SAXReader对象

SAXReader reader = new SAXReader();

//读取文件 转换成Document

Document document = reader.read(new File("src/cn/com/yy/dom4j/s.xml"));

//获取根节点元素对象

Element root = document.getRootElement();

System.out.println("-------添加属性前------");

//获取节点student1

Element student1Element = root.element("student1");

//遍历

listNodes(student1Element);

//获取其属性

Attribute idAttribute = student1Element.attribute("id");

//删除其属性

student1Element.remove(idAttribute);

//为其添加新属性

student1Element.addAttribute("name", "这是student1节点的新属性");

System.out.println("-------添加属性后------");

listNodes(student1Element);

}

(2)结果

[html] view plaincopyprint?





-------添加属性前------

当前节点的名称:student1

<span style="background-color: rgb(255, 0, 0);">属性id:001</span>

当前节点的名称:微信公众号

微信公众号:@残缺的孤独

当前节点的名称:学号

学号:20140101

当前节点的名称:地址

地址:北京海淀区

当前节点的名称:座右铭

座右铭:要么强大,要么听话

-------添加属性后------

当前节点的名称:student1

<span style="background-color: rgb(255, 255, 255);"><span style="color:#ff0000;">属性name:这是student1节点的新属性

</span></span>当前节点的名称:微信公众号

微信公众号:@残缺的孤独

当前节点的名称:学号

学号:20140101

当前节点的名称:地址

地址:北京海淀区

当前节点的名称:座右铭

座右铭:要么强大,要么听话

5、dom4j新增节点

使用dom4j可以删除指定节点、新增节点等操作,我们使用dom4j为student1节点新增phone节点,如下。

(1)代码

[java] view plaincopyprint?





//添加节点

@Test

public void test3()throws Exception{

//创建SAXReader对象

SAXReader reader = new SAXReader();

//读取文件 转换成Document

Document document = reader.read(new File("src/cn/com/yy/dom4j/s.xml"));

//获取根节点元素对象

Element root = document.getRootElement();

System.out.println("-------添加节点前------");

//获取节点student1

Element student1Element = root.element("student1");

//遍历

listNodes(student1Element);

//添加phone节点

Element phoneElement = student1Element.addElement("phone");

//为phone节点设置值

phoneElement.setText("137xxxxxxxx");

System.out.println("-------添加节点后------");

listNodes(student1Element);

}

(2)结果

[html] view plaincopyprint?





-------添加节点前------

当前节点的名称:student1

属性id:001

当前节点的名称:微信公众号

微信公众号:@残缺的孤独

当前节点的名称:学号

学号:20140101

当前节点的名称:地址

地址:北京海淀区

当前节点的名称:座右铭

座右铭:要么强大,要么听话

-------添加节点后------

当前节点的名称:student1

属性id:001

当前节点的名称:微信公众号

微信公众号:@残缺的孤独

当前节点的名称:学号

学号:20140101

当前节点的名称:地址

地址:北京海淀区

当前节点的名称:座右铭

座右铭:要么强大,要么听话

当前节点的名称:phone

<span style="color:#ff0000;">phone:137xxxxxxxx</span>

6、把Document对象写入新的文件

有时,我们需要把document对象写入新的文件,dom4j提供了对应的API以便我们进行操作。我们在完成第 5 后,把document写入新的文件s1.xml,如下。

(1)代码

[java] view plaincopyprint?





//添加节点后,写入新的文件

@Test

public void test4()throws Exception{

//创建SAXReader对象

SAXReader reader = new SAXReader();

//读取文件 转换成Document

Document document = reader.read(new File("src/cn/com/yy/dom4j/s.xml"));

//获取根节点元素对象

Element root = document.getRootElement();

System.out.println("-------添加节点前------");

//获取节点student1

Element student1Element = root.element("student1");

//遍历

listNodes(student1Element);

//添加phone节点

Element phoneElement = student1Element.addElement("phone");

//为phone节点设置值

phoneElement.setText("137xxxxxxxx");

System.out.println("-------添加节点后------");

listNodes(student1Element);

//把student1Element写入新文件

writerDocumentToNewFile(document);

System.out.println("---写入完毕----");

}

//document写入新的文件

public void writerDocumentToNewFile(Document document)throws Exception{

//输出格式

OutputFormat format = OutputFormat.createPrettyPrint();

//设置编码

format.setEncoding("UTF-8");

//XMLWriter 指定输出文件以及格式

XMLWriter writer = new XMLWriter(new OutputStreamWriter(new FileOutputStream(new File("src/cn/com/yy/dom4j/s1.xml")),"UTF-8"), format);

//写入新文件

writer.write(document);

writer.flush();

writer.close();

}

(2)查看s1.xml文件

[html] view plaincopyprint?





<?xml version="1.0" encoding="UTF-8"?>

<students>

<student1 id="001">

<微信公众号>@残缺的孤独</微信公众号>

<学号>20140101</学号>

<地址>北京海淀区</地址>

<座右铭>要么强大,要么听话</座右铭>

<phone>137xxxxxxxx</phone>

</student1>

<student2 id="002">

<新浪微博>@残缺的孤独</新浪微博>

<学号>20140102</学号>

<地址>北京朝阳区</地址>

<座右铭>在哭泣中学会坚强</座右铭>

</student2>

</students>

因为涉及到中文,所以在输出时要设定UTF8编码,OutputStreamWriter进行设置编码。

还有输出格式的问题,在此处使用的是 OutputFormat.createPrettyPrint(),输出文档时进行了排版格式化。还有一种是 OutputFormat.createCompactFormat()方法,输出内容是一行,没有进行格式化,是紧凑型的输出。如下:

[html] view plaincopyprint?





<?xml version="1.0" encoding="UTF-8"?>

<students><student1 id="001"><微信公众号>@残缺的孤独</微信公众号><学号>20140101</学号><地址>北京海淀区</地址><座右铭>要么强大,要么听话</座右铭><phone>137xxxxxxxx</phone></student1><student2 id="002"><新浪微博>@残缺的孤独</新浪微博><学号>20140102</学号><地址>北京朝阳区</地址><座右铭>在哭泣中学会坚强</座右铭></student2></students>
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: