zoukankan      html  css  js  c++  java
  • 使用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("	"+"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("	"+college.getName()+" "+"leader="+leader);
                    }else{
                        System.out.println("	"+"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("	"+"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("	noteele:"+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);
        }
        
    }

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

  • 相关阅读:
    SQL练习题
    数据库基础
    Java-反射与注解
    Linux基础
    pipeline的使用示例
    vagrant与vrtualbox的使用
    12.04公有,私有属性,析构函数,成员属性
    12.1面向对象编程的介绍(oop):封装,继承,多态,访问私有属性
    mysql操作之二:fetchone与获取lastrowid
    10.02经典类的bug
  • 原文地址:https://www.cnblogs.com/sincoolvip/p/5612112.html
Copyright © 2011-2022 走看看