使用dom4j解析XML文档

时间:2021-09-05 03:36:58

dom4j的包开源包,不属于JDK里面,在myeclipse中要单独导入在项目中,这里不累赘了

做这个过程,很慢,因为很多方法没用过不熟悉,自己得去查帮助文档,而且还得去试,因为没有中文版,英文翻译不准确,也会导致多个同名的方法理解和用法不同

XML:

<?xml version="1.0" encoding="utf-8"?>
<students>
<student age="25">
<name>张三</name>
<college>信息学院</college>
<telphone>13610262187</telphone>
<notes>男,1982年生,硕士,现就读于北京邮电大学</notes>
</student>
<student >
<name>李四</name>
<college leader="leader">PC学院</college>
<telphone>13610262187</telphone>
<notes>男,1983年生,硕士,现就读于中国农业大学</notes>
</student> </students>

使用dom4j进行增、删、查、改、保存更新(不想对原文件进行操作,所以输出到另一个文件中,看更新后的内容)

代码如下:

package d0620;

import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.util.Iterator;
import java.util.List; import org.dom4j.DocumentException;
import org.dom4j.io.OutputFormat;
import org.dom4j.io.SAXReader;
import org.dom4j.io.XMLWriter;
import org.dom4j.Attribute;
import org.dom4j.Document;
import org.dom4j.Element;
import org.w3c.dom.NodeList; /*
* 使用Dom4j解析XML文档
*/
public class StudentDom4j {
private Document document;
public void getDom(File file){
// 创建SAXReader creates a DOM4J tree from SAX parsing events. 创建SAX解析器
SAXReader sax=new SAXReader();
try {
// 生成DOM树
document=sax.read(file);
} catch (DocumentException e) {
e.printStackTrace();
} } // 读取student.xml文件中的信息
public void showXML(File file){
// 获取XML的根节点
Element root=document.getRootElement();
System.out.println("Root:"+root.getName()); //获取所有子元素
List<Element> childlist=root.elements();
System.out.println("total child count:"+childlist.size()); //获取特定名称的子元素
List<Element> student=root.elements("student");
System.out.println(student.size());
for(Iterator it=student.iterator();it.hasNext();){
Element studentele=(Element)it.next();
String age=studentele.attributeValue("age");
if(age!=null){
System.out.println("<"+studentele.getName()+" "+"age="+studentele.attributeValue("age")+">");
}else{
System.out.println("<"+studentele.getName()+">");
} //取name的文本
List<Element> names=studentele.elements("name");
for(Iterator nameit=names.iterator();nameit.hasNext();){
Element name=(Element)nameit.next();
System.out.println("\t"+"name="+name.getText());
}
//取college的文本值
List<Element> colleges=studentele.elements("college");
for(Iterator collegeit=colleges.iterator();collegeit.hasNext();){
Element college=(Element)collegeit.next();
//判断有没有属性,如果有就取属性值isTextOnly()如果这个元素只有文本内容则返回true String leader=college.attributeValue("leader");
String text=college.getText();
if(leader!=null){
System.out.println("\t"+college.getName()+" "+"leader="+leader);
}else{
System.out.println("\t"+"college:"+college.getText());
} }
//获取telphone文本值
List<Element> tel=studentele.elements("telphone");
for(Iterator telit=tel.iterator();telit.hasNext();){
Element telele=(Element) telit.next();
System.out.println("\t"+"telphone:"+telele.getText());
} //获取notes文本值
List<Element> notes=studentele.elements("notes");
for(Iterator noteit=notes.iterator();noteit.hasNext();){
Element noteele=(Element) noteit.next();
System.out.println("\tnoteele:"+noteele.getText());
}
} }
// 保存
public void saveXML(File tofile){
// 以XML格式输出createPrettyPrint()创建默认的打印格式
OutputFormat of=OutputFormat.createPrettyPrint();
// 设置编码
of.setEncoding("utf-8");
try {
// 以XML格式输出到dom4j.xml中
XMLWriter writer=new XMLWriter(new FileOutputStream(tofile),of);
// 把源树DOM树输出写进dom4j.xml中
writer.write(document);
writer.close();
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
// 修改XML元素
public void updateEle(){
//先要获取到age
//得到根元素
Element root=document.getRootElement();
//得到 student元素
List<Element> students=root.elements("student");
// 修改<student age="25">的age属性为22
for(Iterator stuit=students.iterator();stuit.hasNext();){
Element stu=(Element) stuit.next();
String age=stu.attributeValue("age");
if(age!=null){
//就是要替换的,修改属性值
stu.attribute("age").setText("22");
}
// 修改<name>李四</name> 的name文本为sb
List<Element> names=stu.elements("name");
for(Iterator name=names.iterator();name.hasNext();){
Element nameele=(Element) name.next();
String nametext=nameele.getText();
if(nametext.equals("李四")){
//替换
nameele.setText("sb");
}
}
// 修改<college leader="leader">的leader值为否
List<Element> colleges=stu.elements("college");
for(Iterator collegeit=colleges.iterator();collegeit.hasNext();){
Element college=(Element) collegeit.next();
String leader=college.attributeValue("leader");
if(leader!=null){
//替换
college.attribute("leader").setText("否");
}
}
}
} // 新增元素
public void addEle(){
/* <student >
<name>杜和雨</name>
<college leader="leader">PC学院</college>
</student>*/
// 创建根节点
Element root=document.getRootElement();
// 创建student标签
Element student=root.addElement("student");
//创建student子标签name
Element name=student.addElement("name");
//给name添加文本
name.setText("杜和雨");
//创建student的子标签college
Element college=student.addElement("college");
//给college添加文本值
college.addAttribute("leader", "big boss"); }
// 删除元素
public void deleteEle(){
/* <student >
<name>李四</name>
<college leader="leader">PC学院</college>
<telphone>13610262187</telphone>
<notes>男,1983年生,硕士,现就读于中国农业大学</notes>
</student>*/ //得到 根节点
Element root=document.getRootElement();
//找到 student节点
List<Element> students=root.elements();
//删除第1个student节点的所有子节点
//students.remove(0); //删除college的属性leader
for(Iterator<Element> stuit=students.iterator();stuit.hasNext();){
Element stu=stuit.next();
List<Element> colleges=stu.elements();
for(Iterator<Element> collit=colleges.iterator();collit.hasNext();){
Element coll=collit.next();
String leader=coll.attributeValue("leader");
if(leader!=null){
coll.remove(coll.attribute("leader"));
}
}
} } // 主函数,测试
public static void main(String[] args){
StudentDom4j sd=new StudentDom4j();
File file=new File("student.xml");
File tofile=new File("dom4j_student.xml");
sd.getDom(file);
sd.showXML(file);
sd.updateEle();
sd.addEle();
sd.deleteEle();
sd.saveXML(tofile);
} }

常用的方法真的要熟悉才行!!!!