DOM4J 解析XML文件

这几天复习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,myfile

log4j.appender.console=org.apache.log4j.ConsoleAppender
log4j.appender.console.Target=System.err
log4j.appender.console.layout=org.apache.log4j.SimpleLayout


log4j.appender.myfile=org.apache.log4j.FileAppender
log4j.appender.myfile.File=log/student.log
log4j.appender.myfile.layout=org.apache.log4j.PatternLayout
log4j.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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值