1. XML文档解析
1.1 DOM4J概述
DOM4J是一个易用的开源的库,可以实现对XML文档的解析。DOM4J使用起来非常简单,只要了解甘醇的XML-DOM模型,就能使用。DOM4J最大的特色是使用大量的接口。目前,DOM4J的使用越来越广泛。
1.2 使用DOM4J操作XML文档 需要下载DOM4J包,在DOM4J官方网站下载后将相应的包加入工程就可以使用了。附上官网网址:
http://sourceforge.net/projects/dom4j/files/
1.3 接下来用一个示例来演示XML文档的解析:
使用DOM4J读取下面XML文档中所有的学生信息,文件名为:studentInfo.xml 且放在src目录下。XML文档结构如下:
<?xml version="1.0" encoding="UTF-8"?>
<students>
<student age="25"><!-- 如果没有age属性,默认的为20 -->
<name>秦羽</name>
<college>PC学院</college>
<telephone>62354666</telephone>
<notes>男,1985年生,硕士,现就读于北京邮电大学</notes>
</student>
<student>
<name>黑羽</name>
<college leader="leader">PC学院</college>
<telephone>62354999</telephone>
<notes>男,1987年生,硕士,现就读于北京邮电大学</notes>
</student>
</students>
实现步骤
(1)导入DOM4J的jar包。这个jar包就是你下载的DOM4J解压后的根目录下这个:dom4j-1.6.1.jar
(2)指定要解析的XML文件。
(3)把XML文件转换成Document对象。
(4)获取节点属性或文本的值
关键代码
Dom4jReadExample.java:
package test;
import java.io.File;
import java.util.HashMap;
import java.util.Iterator;
import org.dom4j.Attribute;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
public class Dom4jReadExample {
/**
* 遍历整个XML文件,获取所有节点的值与其属性 值,并放入HashMap中
*
* @param filename
* String 待遍历的XML文件(相对路径或者绝对路径)
* @param hm
* HashMap 存放遍历结果
*/
@SuppressWarnings("rawtypes")
public void iterateWholeXML(String filename, HashMap<String, String> hm) {
SAXReader saxReader = new SAXReader();
try {
Document document = saxReader.read(new File(filename));
Element root = document.getRootElement();
int num = -1; // 用于记录学生编号的变量
// 遍历根元素(students)的所有子节点(肯定是student节点)
for (Iterator iter = root.elementIterator(); iter.hasNext();) {
Element element = (Element) iter.next();
num++;
// 获取person节点的age属性的值
Attribute ageAttr = element.attribute("age");
if (ageAttr != null) {
String age = ageAttr.getValue();
if (age != null && !age.equals("")) {
hm.put(element.getName() + "-" + ageAttr.getName()
+ num, age);
} else {
hm.put(element.getName() + "-" + ageAttr.getName()
+ num, "20");
}
} else {
hm.put(element.getName() + "-age" + num, "20");
}
for (Iterator iterInner = element.elementIterator(); iterInner
.hasNext();) {
Element elementInner = (Element) iterInner.next();
if (elementInner.getName().equals("college")) {
hm.put(elementInner.getName() + num,
elementInner.getText());
// 获取college节点的leader属性的值
Attribute leaderAttr = elementInner.attribute("leader");
if (leaderAttr != null) {
String leader = leaderAttr.getValue();
if (leader != null && !leader.equals("")) {
hm.put(elementInner.getName() + "-"
+ leaderAttr.getName() + num, "leader");
}
}else{
hm.put(elementInner.getName()+"-leader"+num, "leader");
}
}else{
hm.put(elementInner.getName()+num, elementInner.getText());
}
}
}
} catch (DocumentException e) {
e.printStackTrace();
}
}
}
TestDom4jReadExample.java 关键代码:
package test;
import java.util.HashMap;
public class TestDom4jReadExample {
public static void main(String[] args) {
try {
//获取解析完后的解析信息
HashMap<String ,String> hashMap;
Dom4jReadExample drb=new Dom4jReadExample();
//遍历整个XML文件
hashMap =new HashMap<String, String>();
String n=System.getProperty("user.dir"); //获取当前工程真实路径
//studentInfo.xml保存学生信息,放在src目录下
drb.iterateWholeXML(n+"\\src\\studentInfo.xml", hashMap);
for(int i=0;i<hashMap.size();i+=6){
int j=i/6;
System.out.print(hashMap.get("name"+j)+"\t");
System.out.print(hashMap.get("student-age"+j)+"\t");
System.out.print(hashMap.get("college"+j)+"\t");
System.out.print(hashMap.get("college-leader"+j)+"\t");
System.out.print(hashMap.get("telephone"+j)+"\t");
System.out.println(hashMap.get("notes"+j)+"\t");
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
输出结果:
秦羽 25 PC学院 leader 62354666 男,1985年生,硕士,现就读于北京邮电大学
黑羽 20 PC学院 leader 62354999 男,1987年生,硕士,现就读于北京邮电大学
该示例实现了DOM4J读取XML中的数据。使用DOM4J解析XML的关键操作总结如下:
1.Document对象相关
读取XML文件,获得Document对象。
SAXReader reader=new SAXReader();
Document document=reader.read(new File(“input.xml”));
2.节点相关
(1)获取文档的根元素
Element rootElm=document.getRootElement();
(2)取得某节点的单个子节点
Element memberElm=root.element(“member); //”member”是节点名
(3)取得节点的文字
String text=memberElm.getText();
(4)取得某节点下名为“member”的所有字节点并进行遍历
List nodes=rootElm.elements(“member”);
for(Iterator it=nodes.iterator(); it.hasNext();){
Element elm=(Element)it.next();
//……
}
(5)对某节点下的所有子节点进行遍历
for(Iterator it=root.elementIterator(); it.hasNext();){
Element element=(Element) it.next();
}
(6)在某节点下添加子节点
Element ageElm=newMemberElm.addElement(“age”);
(7)设置节点文字
ageElm.setText(“29”);
(8)删除某节点
parentElm.remove(childElm); //childElm是待删除的节点,parentELm是其父节点
(9)添加一个CDATA节点
Element contentElm=infoElm.addElement(“content”);
contentElm.addCDATA(diary.getContent());
contentElm.getText(); //特别说明:获取节点的CDATA值与获取节点的值是同一个方法
contentElm.clearContent(); //清除节点中的内容,CDATA亦可
3.属性相关
(1)取得某节点下的某属性
Element root = document.getRootElement();
Attribute attribute=root.attribute(“size”); //属性名name
(2)取得属性的文字
String text=attribute.getText();
(3)遍历某节点的所有属性
Element root=document.getRootElement();
for(Iterator it=root.attributeIterator(); it.hasNext();){
Attribute aatribute=(Attribute) it.next();
String text=attribute.getText();
System.out.println(text);
}
(4)设置某节点的属性和文字
newMemeberElm.addAttribute(“name”,”sitinspring”);
(5)设置属性的文字
Attribute attribute=root.attribute(“name”);
attribute.setText(“sitinspring”);