zoukankan      html  css  js  c++  java
  • DOM4J解析XML

    一、DOM4J解析XML文档的实例

    book.xml

    <?xml version="1.0" encoding="UTF-8"?>
    <书架> 
      <> 
        <书名>JavaSE基础</书名>  
        <作者>张三</作者>  
        <售价>38.00</售价>  
        <内部价>19.00</内部价> 
      </>  
      <> 
        <书名>Android</书名>  
        <作者>李四</作者>  
        <售价>28.00</售价> 
      </> 
    </书架>

    DOM4JDemo.java

    package cn.lsl.dom4j;
    import java.io.FileOutputStream;
    import java.io.OutputStream;
    import java.util.List;
    import org.dom4j.Document;
    import org.dom4j.DocumentHelper;
    import org.dom4j.Element;
    import org.dom4j.Node;
    import org.dom4j.io.OutputFormat;
    import org.dom4j.io.SAXReader;
    import org.dom4j.io.XMLWriter;
    import org.junit.Test;
    
    public class DOM4JDemo {
        //1.得到某个具体节点的内容:第二本书的作者
        @Test
        public void test1() throws Exception{
            //得到Document对象
            SAXReader reader = new SAXReader();
            Document document = reader.read("src/book.xml");
            //得到根元素
            Element root = document.getRootElement();
            //依次得到第二本书的作者
            List<Element> es = root.elements("书");
            Element e = es.get(1);
            Element author = e.element("作者");
            System.out.println(author.getText());
        }
        
        //使用XPath方式得到第二本书的作者
        @Test
        public void test2() throws Exception{
            //得到Document对象
            SAXReader reader = new SAXReader();
            Document document = reader.read("src/book.xml");
            String xpath = "//书[2]/作者";
            Node author = document.selectSingleNode(xpath);
            System.out.println(author.getText());
        }
        
        
        //遍历所有元素的节点
        @Test
        public void test3() throws Exception{
            //得到Document对象
            SAXReader reader = new SAXReader();
            Document document = reader.read("src/book.xml");
            //得到根元素
            Element root = document.getRootElement();
            treeWalk(root);
        }
    
        private void treeWalk(Element root) {
            System.out.println(root.getName());
            List<Element> es = root.elements();
            for (Element e : es) {
                treeWalk(e);
            }
        }
        
        //修改某个元素节点的主题内容:修改第2本书的售价
        @Test
        public void test4() throws Exception{
            //得到Document对象
            SAXReader reader = new SAXReader();
            Document document = reader.read("src/book.xml");
            //得到根元素
            Element root = document.getRootElement();
            Element secondBook = (Element)root.elements().get(1);
            Element secondBookPrice = secondBook.element("售价");
            //设置主题内容
            secondBookPrice.setText("28.00");
            //写回XML文档
            OutputStream out = new FileOutputStream("src/book.xml");
            OutputFormat format = OutputFormat.createPrettyPrint();
            XMLWriter writer = new XMLWriter(out, format);
            writer.write(document);
            writer.close();
        }
        
        
        //向指定元素节点中增加子元素节点:给第一本书添加批发价
        @Test
        public void test5() throws Exception{
            SAXReader reader = new SAXReader();
            Document document = reader.read("src/book.xml");
            Element root = document.getRootElement();
            Element firstBook = root.element("书");
            firstBook.addElement("批发价").setText("18.00");
            //写回XML文档
            OutputStream out = new FileOutputStream("src/book.xml");
            OutputFormat format = OutputFormat.createPrettyPrint();
            XMLWriter writer = new XMLWriter(out, format);
            writer.write(document);
            writer.close();
        }
        
        
        //向指定元素节点上增加同级元素节点:在第一本书的售价前面添加内部价
        @Test
        public void test6() throws Exception{
            SAXReader reader = new SAXReader();
            Document document = reader.read("src/book.xml");
            Element root = document.getRootElement();
            //得到第一本书
            Element firstBook = root.element("书");
            //得到第一本书的所有子元素:List
            List<Element> children = firstBook.elements();
            //借组DocumentHelper创建内部价元素
            Element price = DocumentHelper.createElement("内部价");
            price.setText("19.00");
            children.add(3, price);
            //写回XML文档中
            OutputStream out = new FileOutputStream("src/book.xml");
            OutputFormat format = OutputFormat.createPrettyPrint();
            XMLWriter writer = new XMLWriter(out, format);
            writer.write(document);
            writer.close();
        }
        
        //删除指定节点元素:删除批发价
        @Test
        public void test7() throws Exception{
            SAXReader reader = new SAXReader();
            Document document = reader.read("src/book.xml");
            Element root = document.getRootElement();
            Element firstBook = root.element("书");
            Element price = firstBook.element("批发价");
            firstBook.remove(price);
            //写回XML文档中
            OutputStream out = new FileOutputStream("src/book.xml");
            OutputFormat format = OutputFormat.createPrettyPrint();
            XMLWriter writer = new XMLWriter(out, format);
            writer.write(document);
            writer.close();
        }
        
        
        
        //操作XML文件属性:第一本书添加一个出版社属性
        @Test
        public void test8() throws Exception{
            SAXReader reader = new SAXReader();
            Document document = reader.read("src/book.xml");
            Element root = document.getRootElement();
            Element firstBook = root.element("书");
            firstBook.addAttribute("出版社","清华大学出版社");
            //写回XML文档中
            OutputStream out = new FileOutputStream("src/book.xml");
            OutputFormat format = OutputFormat.createPrettyPrint();
            XMLWriter writer = new XMLWriter(out, format);
            writer.write(document);
            writer.close();
        }
        
        //获取第一本书的出版社属性
        @Test
        public void test9() throws Exception{
            SAXReader reader = new SAXReader();
            Document document = reader.read("src/book.xml");
            Element root = document.getRootElement();
            Element firstBook = root.element("书");
            String value = firstBook.attributeValue("出版社");
            System.out.println(value);
        }
    }

    二、案例(学生成绩的增删改查,采用分层开发和DOM4J进行操作)

    首先需要导入dom4j.jar和jaxen.jar

    exam.xml

    <?xml version="1.0" encoding="UTF-8"?>
    <exam> 
      <student examid="444" idcard="333"> 
        <name>李四</name>  
        <location>大连</location>  
        <grade>97</grade> 
      </student> 
    </exam>

    实体类:Student.java

    package cn.lsl.domain;
    public class Student {
        private String idcard;
        private String examid;
        private String name;
        private String location;
        private Double grade;
        public String getIdcard() {
            return idcard;
        }
        public void setIdcard(String idcard) {
            this.idcard = idcard;
        }
        public String getExamid() {
            return examid;
        }
        public void setExamid(String examid) {
            this.examid = examid;
        }
        public String getName() {
            return name;
        }
        public void setName(String name) {
            this.name = name;
        }
        public String getLocation() {
            return location;
        }
        public void setLocation(String location) {
            this.location = location;
        }
        public Double getGrade() {
            return grade;
        }
        public void setGrade(Double grade) {
            this.grade = grade;
        }
        @Override
        public String toString() {
            return "Student [examid=" + examid + ", grade=" + grade + ", idcard="
                    + idcard + ", location=" + location + ", name=" + name + "]";
        }
    }

    工具类:Dom4JUtil.java

    package cn.lsl.util;
    import java.io.FileOutputStream;
    import java.io.OutputStream;
    import org.dom4j.Document;
    import org.dom4j.io.OutputFormat;
    import org.dom4j.io.SAXReader;
    import org.dom4j.io.XMLWriter;
    
    public class Dom4JUtil {
        public static Document getDocument() throws Exception{
            SAXReader reader = new SAXReader();
            return reader.read("src/exam.xml");
        }
        
        public static void writer2xml(Document document) throws Exception{
            OutputStream out = new FileOutputStream("src/exam.xml");
            OutputFormat format = OutputFormat.createPrettyPrint();
            XMLWriter writer = new XMLWriter(out, format);
            writer.write(document);
            writer.close();
        }
    }

    接口:StudentDaoImpl.java

    package cn.lsl.dao.impl;
    import cn.lsl.domain.Student;
    public interface StudentDaoImpl {
        //添加学生信息到XML中
        boolean createStudent(Student s);
        //根据准考证好查询学生信息
        Student findStudent(String examid);
        //根据学生姓名删除学生
        boolean deleteStudent(String name);
    }

    DAO层:StudentDao.java

    package cn.lsl.dao;
    import java.util.List;
    import org.dom4j.Document;
    import org.dom4j.Element;
    import org.dom4j.Node;
    import cn.lsl.dao.impl.StudentDaoImpl;
    import cn.lsl.domain.Student;
    import cn.lsl.util.Dom4JUtil;
    
    public class StudentDao implements StudentDaoImpl {
    
        @Override
        public boolean createStudent(Student s) {
            boolean result = false;
            try{
                Document document = Dom4JUtil.getDocument();
                Element root = document.getRootElement();
                Element studentE = root.addElement("student")
                            .addAttribute("examid", s.getExamid())
                            .addAttribute("idcard", s.getIdcard());
                studentE.addElement("name").setText(s.getName());
                studentE.addElement("location").setText(s.getLocation());
                studentE.addElement("grade").setText(s.getGrade()+"");
                Dom4JUtil.writer2xml(document);
                result = true;
            }catch(Exception e){
                throw new RuntimeException(e);
            }
            return result;
        }
    
        @Override
        public boolean deleteStudent(String name) {
            boolean result = false;
            try{
                Document document = Dom4JUtil.getDocument();
                //选择所有的name元素
                List<Node> nodes = document.selectNodes("//name");
                //遍历
                for (Node n : nodes) {
                    if(n.getText().equals(name))
                        n.getParent().getParent().remove(n.getParent());
                }
                Dom4JUtil.writer2xml(document);
                result = true;
            }catch(Exception e){
                throw new RuntimeException(e);
            }
            return result;
        }
    
        @Override
        public Student findStudent(String examid) {
            Student s = null;
            try{
                Document document = Dom4JUtil.getDocument();
                Node node = document.selectSingleNode("//student[@examid='"+examid+"']");
                if(node!=null){
                    Element e = (Element)node;
                    s = new Student();
                    s.setExamid(examid);
                    s.setIdcard(e.valueOf("@idcard"));
                    s.setName(e.element("name").getText());
                    s.setLocation(e.elementText("location"));
                    s.setGrade(Double.parseDouble(e.elementText("grade")));
                }
            }catch(Exception e){
                throw new RuntimeException(e);
            } 
            return s;
        }    
    }

    View层:Main.java

    package cn.lsl.view;
    
    import java.io.BufferedReader;
    import java.io.InputStreamReader;
    import cn.lsl.dao.StudentDao;
    import cn.lsl.domain.Student;
    
    public class Main {
        public static void main(String[] args) {
            try{
                StudentDao dao = new StudentDao();
                System.out.println("a、添加学生	b、删除学生	c、查询成绩");
                System.out.println("请输入操作类型");
                BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
                String operation = br.readLine();
                if("a".equals(operation)){
                    //添加操作
                    System.out.println("请输入学生姓名");
                    String name = br.readLine();
                    System.out.println("请输入学生准考证号");
                    String examid = br.readLine();
                    System.out.println("请输入学生身份证号");
                    String idcard = br.readLine();
                    System.out.println("请输入学生所在地");
                    String location = br.readLine();
                    System.out.println("请输入学生成绩");
                    String grade = br.readLine();
                    Student s = new Student();
                    s.setExamid(examid);
                    s.setIdcard(idcard);
                    s.setName(name);
                    s.setLocation(location);
                    s.setGrade(Double.parseDouble(grade));
                    //System.out.println(s);
                    boolean b = dao.createStudent(s);
                    if(b){
                        System.out.println("---添加成功---");
                    }else{
                        System.out.println("对不起!数据有误");
                    }
                }else if("b".equals(operation)){
                    System.out.println("请输入要删除的学生姓名:");
                    String name = br.readLine();
                    boolean b = dao.deleteStudent(name);
                    if(b){
                        System.out.println("--删除成功--");
                    }else{
                        System.out.println("对不起!删除失败或者学生不存在");
                    }
                }else if("c".equals(operation)){
                    //查询操作
                    System.out.println("请输入要查询的学生准考证号:");
                    String examid = br.readLine();
                    Student s = dao.findStudent(examid);
                    if(s == null){
                        System.out.println("对不起!您查询的学生不存在");
                    }else{
                        System.out.println(s);
                    }
                }else{
                    System.out.println("请输入正确的操作类型");
                }
            }catch(Exception e){
                System.out.println("对不起!服务器忙!");
            }
        }
    }
  • 相关阅读:
    JavaScript实现继承的几种方式总结一
    MyISAM key 压缩
    Visual Studio2010英文版安装中文帮助文档
    回忆我是怎样走上程序之路的(上)起因
    hdu2054 A==B
    顺序表的增删排序
    hdu2145 zz's Mysterious Present
    hdu 2141 Can you find it?
    hdu1162 Eddy's picture
    hdu1142 A Walk Through the Forest
  • 原文地址:https://www.cnblogs.com/EvanLiu/p/3673157.html
Copyright © 2011-2022 走看看