首页 > 代码库 > Java dom4j 解析xml

Java dom4j 解析xml

1.解析xml

开始之前需要先在项目中导入dom4j的第三方jar包

需要解析的xml:

<?xml version="1.0" encoding="UTF-8"?>
<list>
    <emp id="1" >
        <name>张三</name>
        <age>34</age>
        <gender></gender>
        <salary>3000</salary>
        
    </emp>
    <emp id="2" >
        <name>李四</name>
        <age>14</age>
        <gender></gender>
        <salary>4000</salary>
        
    </emp>
    <emp id="3" >
        <name>王五</name>
        <age>14</age>
        <gender></gender>
        <salary>50000</salary>
        
    </emp>
        <emp id="4" >
        <name>赵六</name>
        <age>29</age>
        <gender></gender>
        <salary>300</salary>
        
    </emp>
    <emp id="5">
        <name>钱7</name>
        <age>53</age>
        <gender></gender>
        <salary>12000</salary>
    </emp>



</list>

Emp类:

/**
 * 该类用于表示emplist.xml文档中的一个emp数据
 * 
 * @author lenovo
 *
 */
public class Emp {
    private int id;
    private String name;
    private int age;
    private String gender;
    private int salary;
    public Emp(){
        
    }
    public Emp(int id, String name, int age, String gender, int salary) {
        super();
        this.id = id;
        this.name = name;
        this.age = age;
        this.gender = gender;
        this.salary = salary;
    }
    public int getId() {
        return id;
    }
    public void setId(int id) {
        this.id = id;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public int getAge() {
        return age;
    }
    public void setAge(int age) {
        this.age = age;
    }
    public String getGender() {
        return gender;
    }
    public void setGender(String gender) {
        this.gender = gender;
    }
    public int getSalary() {
        return salary;
    }
    public void setSalary(int salary) {
        this.salary = salary;
    }
    
    public String toString(){
        return  id+","+name+","+age+","+gender+","+salary;
    }
}

开始解析:

package day07;

import java.io.File;
import java.util.ArrayList;
import java.util.List;

import org.dom4j.Attribute;
import org.dom4j.Document;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;



/**
 * 使用DOM解析XML文档
 * @author lenovo
 *
 */
public class ParseXmlDemo {
    public static void main(String[] args) {
        try {
            /**
             * 解析大致步骤:
             * 1:创建SAXReader
             * 2:使用SAXReader解析指定的xml文档信息,并返回对应Document对象
             *      Document对象中就包含了该XML文档中的所有信息及结构了。
             * 3:根据文档结构将xml描述的树状信息读取到。
             */
            //1:
            SAXReader reader = new SAXReader();
            /**
             * 2:解析xml工作在这里就进行完毕了
             * 
             */
            Document doc =    reader.read(new File("emplist.xml"));
            //3
            List<Emp> list = new ArrayList<Emp>();
                /**
                 * 解析第一步,获取根标签(根元素)
                 * Document提供了一个可以获取根元素的方法;
                 * Element getRootElement();
                 * Element 的每一个实例表示xml文档中一对标签。这里获取的根标签就相当于是
                 * <list>....</list>那对标签。
                 */
            Element root =doc.getRootElement();
            /**
             * 由于xml文档中一个标签可能含有其他子标签
             * 所以Element对象提供了可以获取其表示的标签中的子标签的方法:
             * List elment()
             * 获取当期标签下所有子标签,List集合中存放的是若干个Element实例,
             * 每个实例表示其中一个子标签。
             * 
             * List elements(String name)
             * 获取当前标签下所有同名(参数指定该名字)子标签
             * 
             *  Element element(String name)
             *  获取当前标签下给定名字的标签,若有多个,获取第一个。
             */
            
            List<Element>  elementlist = root.elements("emp");
            //遍历每一个<emp>标签
            
            for(Element empEle: elementlist){
                //获取name的值
                Element nameEle = empEle.element("name");
                /**
                 * String getText()  获取当前标签中间的文本(字符串)
                 * getTextTrim()  去空白。。
                 */
                String name =nameEle.getText();
                
                Element ageEle =empEle.element("age");
                int  age = Integer.parseInt(ageEle.getText());
                /**
                 * String elmentText(String name)
                 * 获取当前标签下给定名字的子标签中间的文本,这个方法等同于上面获取name中间文本的两句代码。
                 */
                String gender =empEle.elementText("gender");
                
                int salary=Integer.parseInt(empEle.elementText("salary"));
                
                /**
                 * Element 还提供了可以用来获取其描述的标签中的属性信息:
                 * Attribute attribute(String name)
                 * 该方法可以获取给定名字的属性,Attribute的每一个实例都可以表示一个标签中的一个属性。
                 */
                Attribute attr =empEle.attribute("id");
                
                int id =Integer.parseInt(attr.getValue());
                
                Emp emp = new Emp(id,name,age,gender,salary);
                
                list.add(emp);
            }
            System.out.println("解析完毕!");
            for(Emp e :list){
                System.out.println(e);
            }
            
        
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

运行结果:

解析完毕!
1,张三,34,男,3000
2,李四,14,女,4000
3,王五,14,女,50000
4,赵六,29,男,300
5,钱7,53,男,12000

2.生成xml文件

/**
 * 使用DOM生产一个XML文档
 *
 */
public class WriteXmlDemo {
    public static void main(String[] args) {
        try {
            List<Emp> list =new ArrayList<Emp>();
            list.add(new Emp(1,"张三",24,"男",5000));
            list.add(new Emp(2,"李四",44,"男",1000));
            list.add(new Emp(3,"王五",34,"女",43000));
            list.add(new Emp(4,"赵六",42,"男",5300));
            list.add(new Emp(5,"钱七",34,"女",12000));
            
            /**
             * 生产XML文档步骤:
             * 1:创建一个Document对象,表示一个空的xml文档
             * 2:向Document中添加根元素
             * 3:按照目标xml文档的结构顺序想根元素中添加子元素来组建该结构。
             * 4:创建XMLWriter
             * 5:设置低级流
             * 6:使用XMLWriter将Document写出来生成该文档。
             */
            //1
            Document doc = DocumentHelper.createDocument();
            //2
            /**
             * Document 提供 了一个方法:
             * Element addElement(String name)
             * 该方法是向当前文档中添加给定名字的根元素
             * 需要注意到 是,由于XML文档要求必须且只能有一个根元素,
             * 所以该方法不能调用两次以上。
             */
            
            Element root =doc.addElement("lsit");
            /**
             * 循环将List集合中每一个Emp对象表示的员工信息转换为一个emp标签,
             * 并添加到根标签中
             */
            for(Emp emp:list){
                /**
                 * Element 也有addElement(),作用是向当前标签下添加
                 * 给定名字的子标签
                 */
                Element empEle =root.addElement("emp");
                
                //想emp标签中添加子标签name
                Element nameEle= empEle.addElement("name");
                
                /**
                 * Element 提供了一个方法
                 * void addText(String text)
                 * 向当前标签中间添加文本信息。返回值还是当前标签,这样的 做饭和StringBuilder的方法
                 * 一样,便于连续操作。
                 */
                nameEle.addText(emp.getName());
                Element ageEle= empEle.addElement("age");
                ageEle.addText(String.valueOf(emp.getAge()));
                Element genderEle =empEle.addElement("gender");
                genderEle.addText(emp.getGender());
                Element salaryEle= empEle.addElement("salary");
                salaryEle.addText(emp.getSalary()+"");
                /**
                 * Element还提供了一个用来向当前标签中添加属性的方法
                 * Element addAttribute(String name,String value)
                 */
                empEle.addAttribute("id", emp.getId()+"");
                    
            }
            //org.dom4j.XMLWriter
            XMLWriter writer = new XMLWriter(
                    OutputFormat.createPrettyPrint());
            
            /**
             * 向文件myemp.xml中写数据
             */
            FileOutputStream fos = new FileOutputStream("myemp.xml");
            
            writer.setOutputStream(fos);
            /**
             * 将给定的Document对应的文档信息写出
             */
            writer.write(doc);
            
            writer.close();
            
            
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

结果:

<?xml version="1.0" encoding="UTF-8"?>

<lsit>
  <emp id="1">
    <name>张三</name>
    <age>24</age>
    <gender></gender>
    <salary>5000</salary>
  </emp>
  <emp id="2">
    <name>李四</name>
    <age>44</age>
    <gender></gender>
    <salary>1000</salary>
  </emp>
  <emp id="3">
    <name>王五</name>
    <age>34</age>
    <gender></gender>
    <salary>43000</salary>
  </emp>
  <emp id="4">
    <name>赵六</name>
    <age>42</age>
    <gender></gender>
    <salary>5300</salary>
  </emp>
  <emp id="5">
    <name>钱七</name>
    <age>34</age>
    <gender></gender>
    <salary>12000</salary>
  </emp>
</lsit>

Java dom4j 解析xml