美文网首页
dom4j解析xml

dom4j解析xml

作者: 沉浮_0644 | 来源:发表于2018-09-15 23:42 被阅读0次

    DOM解析原理:xml解析器一次性把整个xml文档加载进内存,然后在内存中构建一颗Document的对象树,通过Document对象,得到树上的节点对象,通过节点对象访问(操作)到xml文档的内容。

    1. 在src目录下建立一个lib包,将dom4j-1.6.1.jar这个jar包放在该目录下(该jar包可在网上下载),右击在jar文件选择Build path—>add to Build path,导入jar包成功。

    2. 准备工作,在src下建立一个xml目录,并在目录下建立一个Emp类

    '''
    package xml;
    public class Emp {
    private int id;
    private String name;
    private int age;
    private String gender;
    private int salary;
    public Emp(int id, String name, int age, String gender, int salary) {
    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;
    }
    
    @Override
    public String toString() {
        return "Emp [id=" + id + ",name=" + name + ",age=" + age + ","
                + "gender=" + gender + ",salary=" + salary + "]";
    }
    

    }
    '''

    1. 在项目目录下建立emplist.xml文件,注意:在项目目录下建立,不是src目录下面。

    '''
    <?xml version="1.0" encoding="UTF-8"?>
    <list>
    <emp id="1">
    <name>张三</name>
    <age>23</age>
    <gender>男</gender>
    <salary>2000</salary>
    </emp>
    <emp id="2">
    <name>李四</name>
    <age>63</age>
    <gender>男</gender>
    <salary>2500</salary>
    </emp>
    <emp id="3">
    <name>王五</name>
    <age>42</age>
    <gender>女</gender>
    <salary>12000</salary>
    </emp>
    <emp id="4">
    <name>小李</name>
    <age>33</age>
    <gender>女</gender>
    <salary>4000</salary>
    </emp>
    <emp id="5">
    <name>小静</name>
    <age>18</age>
    <gender>女</gender>
    <salary>3800</salary>
    </emp>
    </list>
    '''

    4、对emplist.xml进行解析
    '''
    package xml;

    import java.io.File;
    import java.io.FileInputStream;
    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 ssk

    /
    public class ParseXmlDemo {
    public static void main(String[] args) {
    /

    * 将emplist.xml文档中所有文档信息解析出来
    * 存入到List集合中
    * 每个员工以一个Emp实例保存
    */

        List<Emp> list = new ArrayList<Emp>();
    
        /*
         * 使用dom解析XML文档的大致流程
         * 1:创建SAXReader
         * 2:使用SAXReader读取xml文档,并生成文档的Document对象,该对象保存了该文档所有数据及结构。
         *  这一步也是DOM解析耗时消耗资源的地方
         * 3:通过Document对象获取根元素
         * 4:按照XML文档的结构从跟元素开始逐步获取子元素以达到遍历XML文档数据的目的。
         */
        try {
            //1
            SAXReader reader = new SAXReader();
    
            //2
            //Document document = reader.read(new File("emplist.xml"));
            Document document = reader.read(new FileInputStream("emplist.xml"));
    
            //3
            Element  root = document.getRootElement();
            /*
             * 获取根元素<List>中所有名为emp的子元素
             */
            List<Element> empList = root.elements("emp");
    
            /*
             * 遍历每个<emp>标签,获取员工信息
             */
            for(Element empEle : empList) {
                //获取员工名字
                //1、获取<name>标签
                Element nameEle = empEle.element("name");
                //2、获取<name>标签中间的文本
                String name = nameEle.getText();
    
                Element ageEle = empEle.element("age");
                int age = Integer.parseInt(ageEle.getText());
    
                Element genderEle = empEle.element("gender");
                String gender = genderEle.getText();
                //String gender = empEle.elementText("gender");
    
                Element salaryEle = empEle.element("salary");
                int salary = Integer.parseInt(salaryEle.getText());
    
                //获取id
                //1、获取id属性
                Attribute attr = empEle.attribute("id");
                int id = Integer.parseInt(attr.getValue());
            //  int id = Integer.parseInt(empEle.attributeValue("id"));
    
                Emp emp = new Emp(id,name,age,gender,salary);
                list.add(emp);
            }
    
            System.out.println("解析完毕!");
    
            for(Emp p : list) {
                System.out.println(p);
            }
    
    
        }catch(Exception e) {
            e.printStackTrace();
        }
    
    }
    

    }
    '''

    5、读XML的基本方法
    Element getRootElement():Document提供了获取根元素的方法

    String getName(): 获取当前标签的名字

    String getText(): 获取当前标签中间的文字

    Element element(String name): 获取当前标签指定名字的子标签

    List elements(): 获取当前标签中的所有子标签

    List elements(String name): 获取当前标签下所有指定名字的同名字标签

    Attribute attribute(String name):获取指定名字的属性,Attribute的每一个实例用于表示>>>一个标签中的一个属性, 可以通过它获取该属性的名字与对应的属性值。

    String attributeValue(String name):可以直接获取当前标签中指定名字的属性所对应的>>>值。

    6、生成一个xml文件
    '''
    package xml;

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

    import org.dom4j.Document;
    import org.dom4j.DocumentHelper;
    import org.dom4j.Element;
    import org.dom4j.io.XMLWriter;

    /**

    • 使用DOM4j生成一个XML文档
    • @author ssk

    */
    public class WriteXmlDemo {
    public static void main(String[] args) {
    List<Emp> list = new ArrayList<Emp>();
    list.add(new Emp(1,"张三",23,"男",2000));
    list.add(new Emp(2,"李四",43,"女",2400));
    list.add(new Emp(3,"王五",10,"男",3000));
    list.add(new Emp(4,"小静",64,"女",4000));
    list.add(new Emp(5,"铁蛋",27,"男",2500));

        /*
         * 生成XML的大致步骤
         * 1:创建一个Document对象,表示一个空白文档
         * 2:向Document中添加根元素
         * 3:创建XMLWriter
         * 5:使用XMLWriter将Document对象写出以生成文档
         */
        try {
            //1
            Document doc = DocumentHelper.createDocument();
    
            //2
    
            Element root = doc.addElement("list");
    
            /*
             * 将集合中每个员工信息以一个<emp>标签添加到根标签中
             */
            for(Emp emp : list) {
                //向根标签中添加名为<emp>的子元素
                Element empEle = root.addElement("emp");
                //向<emp>标签中添加<name>子标签
                Element nameEle = empEle.addElement("name");
                nameEle.addText(emp.getName());
    
                Element ageEle = empEle.addElement("age");
                ageEle.addText(emp.getAge()+"");
    
                Element genderEle = empEle.addElement("gender");
                genderEle.addText(emp.getGender());
    
                Element salaryEle = empEle.addElement("salary");
                salaryEle.addText(emp.getSalary()+"");
    
                //添加属性:id
                empEle.addAttribute("id", emp.getId()+"");
            }
    
            XMLWriter writer = new XMLWriter(
                    new FileOutputStream("myemp.xml"),OutputFormat.createPrettyPrint()
                    );
            writer.write(doc);
    
            System.out.println("写出完毕!");
            writer.close();
    
        }catch(Exception e) {
            e.printStackTrace();
        }
    }
    

    }
    '''
    注意:1、所有导入的有关xml的包必须为org.dom4j下的包,如果没有正确导入对应的包可能会报错,或出现其他不理想的情况。
    2、XMLWriter构造方法中加入参数OutputFormat.createPrettyPrint(),生成的带有格式化的xml文件,如果不加,则生成的xml文件内容在一行。

    相关文章

      网友评论

          本文标题:dom4j解析xml

          本文链接:https://www.haomeiwen.com/subject/agxpwftx.html