DOM4J 解析XML文件

来源:互联网 发布:网络对传统文化的影响 编辑:程序博客网 时间:2024/06/14 00:17

这几天复习java知识就顺便弄了一个这么一个小的Demo案例跟大家分享一下。 如果按照这个目录一点点的搭建起来 。代码下边都有 基本是可以正常运行的 。如果有问题的话 大家可以加微信(QQ) 354032267 一起交流、、共同进步。。

目录结构

这里写图片描述

我就直接把每部分的代码贴出来吧。

  1. IStudentDao.java
package dao;import java.util.List;import entity.Student;public interface IStudentDao {    public List<Student> findAll();    public boolean addStudent(Student student);    public boolean deleteStudent(String sno);}
  1. StudentDaoImpl.java
package dao.impl;import java.io.File;import java.io.FileOutputStream;import java.io.IOException;import java.io.OutputStream;import java.util.ArrayList;import java.util.List;import javax.xml.parsers.DocumentBuilder;import javax.xml.parsers.DocumentBuilderFactory;import javax.xml.parsers.ParserConfigurationException;import javax.xml.transform.Result;import javax.xml.transform.Source;import javax.xml.transform.Transformer;import javax.xml.transform.TransformerConfigurationException;import javax.xml.transform.TransformerException;import javax.xml.transform.TransformerFactory;import javax.xml.transform.dom.DOMSource;import javax.xml.transform.stream.StreamResult;import org.w3c.dom.DOMException;import org.w3c.dom.Document;import org.w3c.dom.Element;import org.w3c.dom.Node;import org.w3c.dom.NodeList;import org.xml.sax.SAXException;import dao.IStudentDao;import entity.Student;public class StudentDaoImpl implements IStudentDao {    @Override    public List<Student> findAll() {        List<Student> all = new ArrayList<Student>();;        try {               //创建解析器工厂对象            DocumentBuilderFactory factory=DocumentBuilderFactory.newInstance();            //创建解析器对象            DocumentBuilder db=factory.newDocumentBuilder();            //获取文档对象            Document doc=db.parse(new File("db\\student.xml"));            //获取根节点            Element rootEle=doc.getDocumentElement();            NodeList nodeList=rootEle.getElementsByTagName("student");            for (int i = 0; i < nodeList.getLength(); i++) {                Student student=new Student();                Node studentNode=nodeList.item(i);                //为了获取标签中的属性,所以要将Node向下转型                Element studentEle=(Element) studentNode;                //可以根据属性名称获取属性的值                String sno=studentEle.getAttribute("sno");                student.setSno(sno);                //获取Student节点下的所有子节点                NodeList studentChild=studentNode.getChildNodes();                for (int j = 0; j < studentChild.getLength(); j++) {                    Node studentChildNode=studentChild.item(j);                    if(studentChildNode.getNodeName().equals("sname")){                         student.setSname(studentChildNode.getTextContent());                    }                    if(studentChildNode.getNodeName().equals("sex")){                         student.setSex(studentChildNode.getTextContent());                    }                    if(studentChildNode.getNodeName().equals("age")){                         student.setAge(Integer.parseInt(studentChildNode.getTextContent()));                     }                }                all.add(student);            }        } catch (DOMException e) {            // TODO Auto-generated catch block            e.printStackTrace();        } catch (ParserConfigurationException e) {            // TODO Auto-generated catch block            e.printStackTrace();        } catch (SAXException e) {            // TODO Auto-generated catch block            e.printStackTrace();        } catch (IOException e) {            // TODO Auto-generated catch block             e.printStackTrace();        }        return all;    }    @Override    public boolean addStudent(Student student) {        boolean flag=false;        try {            //创建解析器工厂对象            DocumentBuilderFactory factory=DocumentBuilderFactory.newInstance();            //创建解析器对象            DocumentBuilder db=factory.newDocumentBuilder();            //获取文档对象            Document doc=db.parse(new File("db\\student.xml"));            //获取根节点            Element rootEle=doc.getDocumentElement();            //创建名称为student的节点            Element studentEle=doc.createElement("student");            Element snameEle=doc.createElement("sname");            Element sexEle=doc.createElement("sex");            Element ageEle=doc.createElement("age");            //为student节点设置属性            studentEle.setAttribute("sno",student.getSno());            //给节点添加元素内容            snameEle.setTextContent(student.getSname());            sexEle.setTextContent(student.getSex());            ageEle.setTextContent(String.valueOf(student.getAge()));            //设置关系            studentEle.appendChild(snameEle);            studentEle.appendChild(sexEle);            studentEle.appendChild(ageEle);            //设置student为根节点students的子节点            rootEle.appendChild(studentEle);            //将DOM模型转成XML文件            TransformerFactory tranFactory=TransformerFactory.newInstance();            Transformer tran=tranFactory.newTransformer();            Source xmlSource=new DOMSource(doc);            OutputStream outputStream=new FileOutputStream(new File("db\\student.xml"));            Result outputTarget=new StreamResult(outputStream);            tran.transform(xmlSource, outputTarget);            flag=true;        } catch (ParserConfigurationException e) {            e.printStackTrace();        } catch (SAXException e) {            // TODO Auto-generated catch block            e.printStackTrace();        } catch (IOException e) {            // TODO Auto-generated catch block            e.printStackTrace();        }catch (TransformerConfigurationException e) {            e.printStackTrace();        }catch (TransformerException e) {            e.printStackTrace();        }        return flag;    }    @Override    public boolean deleteStudent(String sno) {        boolean flag=false;        try {            //创建解析器工厂对象            DocumentBuilderFactory factory=DocumentBuilderFactory.newInstance();            //创建解析器对象            DocumentBuilder db=factory.newDocumentBuilder();            //获取文档对象            Document doc=db.parse(new File("db\\student.xml"));            //获取根节点            Element rootEle=doc.getDocumentElement();            NodeList nodeList=rootEle.getElementsByTagName("student");            for (int i = 0; i < nodeList.getLength(); i++) {                Node node=nodeList.item(i);                Element ele=(Element) node;                String no=ele.getAttribute("sno");                if(no.equals(sno)){                     rootEle.removeChild(node);                    break;                }            }            //将DOM模型转成XML文件            TransformerFactory tranFactory=TransformerFactory.newInstance();            Transformer tran=tranFactory.newTransformer();            Source xmlSource=new DOMSource(doc);            OutputStream outputStream=new FileOutputStream(new File("db\\student.xml"));            Result outputTarget=new StreamResult(outputStream);            tran.transform(xmlSource, outputTarget);            flag=true;        } catch (ParserConfigurationException e) {            // TODO Auto-generated catch block            e.printStackTrace();        } catch (SAXException e) {            // TODO Auto-generated catch block            e.printStackTrace();        } catch (IOException e) {            // TODO Auto-generated catch block            e.printStackTrace();        }catch (TransformerConfigurationException e) {            e.printStackTrace();        }catch (TransformerException e) {            e.printStackTrace();        }        return flag;    }}

3.实体类 Student.java

package entity;public class Student {    private String sno;    private String sname;    private String sex;    private int age;    public Student() {        super();    }    public Student(String sno, String sname, String sex, int age) {        super();        this.sno = sno;        this.sname = sname;        this.sex = sex;        this.age = age;    }    public String getSno() {        return sno;    }    public void setSno(String sno) {        this.sno = sno;    }    public String getSname() {        return sname;    }    public void setSname(String sname) {        this.sname = sname;    }    public String getSex() {        return sex;    }    public void setSex(String sex) {        this.sex = sex;    }    public int getAge() {        return age;    }    public void setAge(int age) {        this.age = age;    }    @Override    public String toString() {        // TODO Auto-generated method stub        return sno+"\t"+sname+"\t"+sex+"\t"+age;    }}
  1. 运行 :Menu.java
package menu;import java.util.List;import java.util.Scanner;import org.apache.log4j.Logger;import dao.IStudentDao;import dao.impl.StudentDaoImpl;import entity.Student;public class Menu {    private static Logger logger=Logger.getLogger(Menu.class);    public static void main(String[] args) {        Scanner input=new Scanner(System.in);        IStudentDao sm=new StudentDaoImpl();        while(true){            System.out.println("*********学生管理系统**********");            System.out.println("1、增加学生");            System.out.println("2、学生列表");            System.out.println("3、删除学生");              System.out.println("****************************");            System.out.println("请选择:");            int choice=input.nextInt();            switch (choice) {            case 1:                System.out.println("学生管理系统>增加学生");                System.out.println("请输入学生编号:");                String sno=input.next();                System.out.println("请输入学生姓名:");                String name=input.next();                System.out.println("请输入学生的性别:");                String sex=input.next();                System.out.println("请输入学生年龄:");                int age=input.nextInt();                //实例化和初始化                Student s=new Student(sno, name, sex, age);                boolean isAdd=false;                try {                    isAdd = sm.addStudent(s);                } catch (IllegalArgumentException e) {                    System.out.println(e.getMessage());                     logger.error(e.getMessage());                }                if(isAdd){                    System.out.println("增加成功!");                }else{                    System.out.println("增加失败!");                }                break;            case 2:                System.out.println("学生管理系统>学生列表");                List<Student> all=sm.findAll();                if(!all.isEmpty()){                    System.out.println("学号\t姓名\t性别\t年龄");                      for (int i = 0; i < all.size(); i++) {                        Student student=(Student) all.get(i);                        System.out.println(student);                    }                }else{                    System.out.println("======sorry,暂无数据!= ========");                }                break;            case 3:                System.out.println("学生管理系统>删除学生");                 System.out.println("请输入要删除的学生编号:");                String sno1=input.next();                boolean isDel=false;                try {                    isDel=sm.deleteStudent(sno1);                } catch (IllegalArgumentException e) {                    logger.error(e.getMessage());                  }                if(isDel){                    System.out.println("删除成功!");                }else{                    System.out.println("删除失败!");                  }                break;            default:                break;            }        }    }}
  1. 列表内容 log4j.properties 配置
log4j.rootLogger=debug,myfilelog4j.appender.console=org.apache.log4j.ConsoleAppenderlog4j.appender.console.Target=System.errlog4j.appender.console.layout=org.apache.log4j.SimpleLayoutlog4j.appender.myfile=org.apache.log4j.FileAppenderlog4j.appender.myfile.File=log/student.loglog4j.appender.myfile.layout=org.apache.log4j.PatternLayoutlog4j.appender.myfile.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %l %p %m%n

log4j的jar文件 自己去下载。。。

XML student.dtd 文件

<!ELEMENT students (student*)><!ELEMENT student (sname,sex,age?)><!ATTLIST student sno CDATA #REQUIRED><!ELEMENT sname (#PCDATA)><!ELEMENT sex (#PCDATA)><!ELEMENT age (#PCDATA)>

Xml文件 student.xml

<?xml version="1.0" encoding="UTF-8" standalone="no"?><students>    <student sno="1001">        <sname>张三</sname>        <sex></sex>        <age>23</age>    </student>    <student sno="1002">        <sname>李影</sname>        <sex></sex>        <age>22</age>    </student>    <student sno="1003">        <sname>王五</sname>        <sex></sex>        <age>23</age>    </student>    <student sno="1004">        <sname>路正</sname>        <sex></sex>        <age>21</age>    </student></students>

如果我的这篇博文 有助于您了解基础的xml解析的话,您可以可以随便赏点小编。

这里写图片描述

1 0