JAVA如何使用Dom4j解析xml的DEMO案例

首先导入Dom4J的jar包(密码:kjv8)

打印出xml文件中地产公司的id,名称和地址

demo01.xml


<companys>
    <company id="1001">
        <name>万科Aname>
        <address>广东深圳address>
    company>
    <company id="1002">
        <name>恒大Bname>
        <address>广东广州address>
    company>
    <company id="1003">
        <name>金地Cname>
        <address>北京address>
    company>
    <company id="1006">
        <name>绿地Dname>
        <address>上海address>
    company>
companys>

Company类

import java.io.Serializable;

public class Company implements Serializable{
    private static final long serialVersionUID = 1L;
    private Integer id;
    private String name;
    private String address;

    public Company() {}
    public Company(String name, String address) {
        this.name = name;
        this.address = address;
    }
    public Company(Integer id, String name, String address) {
        this.id = id;
        this.name = name;
        this.address = address;
    }

    public Integer getId() {
        return id;
    }
    public void setId(Integer id) {
        this.id = id;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public String getAddress() {
        return address;
    }
    public void setAddress(String address) {
        this.address = address;
    }
    @Override
    public int hashCode() {
        final int prime = 31;
        int result = 1;
        result = prime * result + ((id == null) ? 0 : id.hashCode());
        return result;
    }
    @Override
    public boolean equals(Object obj) {
        if (this == obj)
            return true;
        if (obj == null)
            return false;
        if (getClass() != obj.getClass())
            return false;
        Company other = (Company) obj;
        if (id == null) {
            if (other.id != null)
                return false;
        } else if (!id.equals(other.id))
            return false;
        return true;
    }
    @Override
    public String toString() {
        return "Company [id=" + id + ", name=" + name + ", address=" + address + "]\n\r";
    }
}

DOM4J解析XML文件

import java.io.InputStream;
import java.util.Iterator;
import org.dom4j.Attribute;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;

/**
 * DOM4J解析XML文件
 */
public class XMLDemo1 {

    public static void main(String[] args) throws DocumentException{
        /** 1.创建一个读取XML文件的对象 用来指向XML文件的输入流
         *  这个XML文件其实就是磁盘上的一个物理文件,我需要将它变成JAVA的对象
         *  我们知道JAVA的对象是存在内存中的,所以我们就是要将物理的磁盘上的数据拿到内存中
         *  那么首先我们是要将文件的内容拿到内存中,然后再内存中进行处理
         */
        SAXReader reader = new SAXReader();

        /**
         * 2.创建一个(当前项目类路径下的)输入流 指向这个XML文件
         * 因为它不是直接将文件内容拿到内存里,而是通过读取流,所以要先创建一个输入流
         * 语法:
         * InputStream 引用名 = 类名.class.getClassLoader().getResourceAsStream("文件名");
         */
        InputStream is = 
                XMLDemo1.class.getClassLoader().getResourceAsStream("demo01.xml");
        /**
         *3.我们通过SAXReader这个对象利用流来读取这个对象 通过这个方法我们就把所有的XML数据拿到内存里了 返回了一个文档类型的对象
         * 通过reader下的对象调用read()方法,并且将InputStream对象传进去
         * 注意:导包的时候导入import org.dom4j.Document;包
         */
         Document doc = reader.read(is); 

         /**
          * 拿到XML的内容之后,首先我们要读取xml的根元素,再通过根元素读取子元素,再读取元素点里面的值
          */
         /**
          * 4.获取根元素 
          * 注意:导包的时候导入import org.dom4j.Element;
          */
         Element root = doc.getRootElement();
         //System.out.println(root.getName()); //获取根元素的名字 companys

        /**
         * 5.通过根元素获取子元素的迭代器
         * 导入:
         * import java.util.Iterator;包
         * import org.dom4j.Attribute;包
         */
         Iterator it = root.elementIterator();
         while(it.hasNext()){
             Element e = it.next();//获取子元素
             //System.out.println(e.getName());

             // 获取属性值:方法一: 通过元素对象获取元素属性值
             //String id = e.attributeValue("id"); //获取属性id的值 注意在XML中拿到的所有数据都是String类型
             // System.out.println(id);
             // 获取元素的属性 方法二
             Attribute idAttr = e.attribute("id");
             String id = idAttr.getValue();
             //System.out.println(id);

             //通过元素对象获取子元素对象
             Element nameElement = e.element("name");
             //获取元素中的文本内容
             String name = nameElement.getText();
             //System.out.println(name); //万科A恒大B金地C招商D
             //获取公司地址
             Element addressElement = e.element("address");
             String address = addressElement.getText();
             System.out.println(address);


             //封装对象
             Company company = new Company();
             company.setId(Integer.parseInt(id));
             company.setName(name);
             company.setAddress(address);
             System.out.println(company); 
             /**
              * Company [id=1001, name=万科A, address=广东深圳]
              * Company [id=1002, name=恒大B, address=广东广州]
              * Company [id=1003, name=金地C, address=北京]
              * Company [id=1006, name=绿地D, address=上海]
              */
         }   
    }
}

XPath应用解析xml文件,XPath应用和Dom4j是一个整体,实际上它是Dom4j里面的一个工具。
首先导入jaxen-1.1-beta-7.jar的jar包(密码:kjv8)
XPath是一门在XML文档中快速查找信息的语言。
单纯使用dom访问节点时,需要一层一层的处理。如果有了XPath,定位节点将变得很轻松,可以根据路径表达式快速检索元素、属性。

     XPath应用通过路径的写法
       / :从根路径查找    "/companys/company/name"
       //:从当前元素直接获取匹配的元素 "//name"
       ..:查找当前元素的父元素   ".."
       . :查找当前元素
       @ :查找当前元素的属性   "//company//@id"
import java.io.InputStream;
import java.util.List;
import org.dom4j.Attribute;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;

/**
 * 
 * DOM4J解析XML   XPath应用
 * 
 */
public class XMLDemo2 {

    public static void main(String[] args) throws DocumentException {
        //1、 创建一个读取XML文件的对象  用来读取指向XML文件的输入流
        SAXReader reader = new SAXReader();     
        //2、创建一个输入流
        InputStream is = 
                XMLDemo2.class.getClassLoader().getResourceAsStream("demo01.xml");
        //3、获取当前XML文档对象
        Document doc = reader.read(is);
        Element root = doc.getRootElement();

        //根据"/"路径获取元素
        List list = root.selectNodes("/companys/company/name");
        System.out.println(list.size());
        for (Element element : list) {
            System.out.println("name元素的值是:"+element.getText());
        }       
        //根据"//"路径获取元素
        List list1 = root.selectNodes("//name");
        System.out.println(list1.size());
        for (Element element : list1) {
            System.out.println("name元素的值是:"+element.getText());
            /**
             * name元素的值是:万科A
               name元素的值是:恒大B
               name元素的值是:金地C
               name元素的值是:绿地D
             */
        }       
        //根据 ".."获取父元素,根据 "."获取当前元素,
        Element companyEle = root.element("company");
        //System.out.println(companyEle.attributeValue("id"));
        Element fat = (Element) companyEle.selectSingleNode("..");//Node
        //Element fat = (Element) companyEle.selectSingleNode(".");//Node
        System.out.println("父节点"+fat.getName());//companys  
        System.out.println(">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>");
        //根据"@"获取属性
        List list2 = root.selectNodes("//company//@id");
        System.out.println(list2.size()); //4
        for (Attribute attribute : list2) {
            System.out.print(attribute.getValue()+" ");//1001 1002 1003 1006 
        }
    }
}

你可能感兴趣的:(JAVA的那些事儿)