使用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);
    }
    
}

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

posted @ 2016-06-23 20:27  sincoolvip  阅读(487)  评论(0编辑  收藏  举报