使用dom4j解析XML文档
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); } }
常用的方法真的要熟悉才行!!!!
如果您认为阅读这篇博客让您有些收获,不妨点击一下右下角的【推荐】
本文版权归作者和博客园共有,欢迎转载