java讀寫XML文件 (DOM)

首先項目裏添加2個jar包,jar包名如下:
dom4j-1.6.1.jar
jaxen-1.1.1.jar

emp.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>21</age>
        <gender></gender>
        <salary>4000</salary>
    </emp>
    <emp id="3">
        <name>王五</name>
        <age>46</age>
        <gender></gender>
        <salary>6500</salary>
    </emp>
    <emp id="4">
        <name>趙六</name>
        <age>28</age>
        <gender></gender>
        <salary>4400</salary>
    </emp>
    <emp id="5">
        <name>錢七</name>
        <age>53</age>
        <gender></gender>
        <salary>12000</salary>
    </emp>
</list>

myemp.xml

<?xml version="1.0" encoding="UTF-8"?>
<list>
    <emp id="1">
        <name>jack</name>
        <age>33</age>
        <gender></gender>
        <salary>5000</salary>
    </emp>
    <emp id="2">
        <name>boss</name>
        <age>55</age>
        <gender></gender>
        <salary>55000</salary>
    </emp>
    <emp id="3">
        <name>marry</name>
        <age>22</age>
        <gender></gender>
        <salary>3500</salary>
    </emp>
    <emp id="4">
        <name>kate</name>
        <age>25</age>
        <gender></gender>
        <salary>6000</salary>
    </emp>
    <emp id="5">
        <name>tom</name>
        <age>32</age>
        <gender></gender>
        <salary>8500</salary>
    </emp>
</list>

Emp.class

package day20150924;
/**
 * 該類用於描述emp.xml文件中表示的員工
 * 子類方法具備多態(假設Person和Son都有age屬性和run方法)
 * Person p = new Son();
 * p.run();//調用子類方法
 * 屬性不具備多態
 * p.age;//調用父類屬性
 */
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;
    }

    @Override
    public String toString() {
        return id+","+name+","+age+","+gender+","+salary;
    }

}
package day20150924;

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文件
 */
public class XMLDemo1 {
    public static void main(String[] args) {
        try{
            /*
             * 解析XML文件的基本流程
             * 1:創建SAXReader,用來讀取XML文件
             * 2:指定XML文件使得SAXReader讀取,並解析文檔對象Document
             * 3:獲取根元素
             * 4:獲取每一個元素,從而達到解析的目的
             */
            //1:創建SAXReader,用來讀取XML文件
            SAXReader reader = new SAXReader();//帶Reader都是字符流
            //2:指定XML文件使得SAXReader讀取,並解析文檔對象Document
            File xmlFile = new File("emp.xml");
            /*
             * 常用的讀取方法:
             * Document read(InputStream in)
             * Document read(Reader read)
             * Document read(File file)

             * read方法的作用:
             * 讀取給定的xml,並將其解析轉換爲一個Document對象,
             * 實際上這裏已經完成了對整個xml的解析工作,
             * 並將所有的內容封裝到了Document對象中。
             * Document對象可以描述當前xml文檔
             */
            Document doc = reader.read(xmlFile);
            //3:獲取根元素,拿到list元素
            Element root = doc.getRootElement();
            //4 獲取每個元素
            /*
             * Element element(String name)
             * 獲取當前標籤下的第一個給定名字的標籤
             * 
             * List elements(String name)
             * 獲取當前標籤下所有給定名字的標籤
             * 
             * List elements()
             * 獲取所有子標籤
             */
            List<Element> elements = root.elements("emp");
            /*
             * 創建集合,保存xml中每個用戶的信息,然後創建Emp實例,
             * 將信息設置到該實例的相應屬性上。
             * 最終將所有emp對象存入該集合
             */
            List<Emp> list = new ArrayList<Emp>();
            /*
             * 遍歷每個emp標籤
             */
            for(Element emp : elements){
                Emp e = new Emp();
                //解析emp標籤
                //獲取name的值
                Element ename = emp.element("name");
                //獲取前後標籤中的文本
                String name = ename.getTextTrim();
                //獲取年齡
                /*
                 * String elementText(String name)
                 * 獲取當前標籤中給定名字的子標籤中間的文本
                 * 該方法與上面取得name的兩句話等效
                 */
                int age = Integer.parseInt(emp.elementText("age"));
                String gender = emp.elementText("gender");
                int salary = Integer.parseInt(emp.elementText("salary"));
                e.setName(name);
                e.setAge(age);
                e.setGender(gender);
                e.setSalary(salary);
                //獲取id屬性
                Attribute attr = emp.attribute("id");
                /*
                 * Attribute表示一個屬性,常用方法:
                 * String getValue():獲取該屬性的值
                 * String getName():獲取該屬性的名字
                 */
                int id = Integer.parseInt(attr.getValue());
                e.setId(id);
                list.add(e);
            }
            System.out.println("解析了"+list.size()+"個員工信息");
            for(Emp emp : list){
                System.out.println(emp);
            }
        }catch(Exception e){

        }
    }

}
package day20150924;

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;

/**
 * 使用DOM寫出一個XML
 */
public class XMLDemo2 {

    public static void main(String[] args) {
        List<Emp> list = new ArrayList<Emp>();
        list.add(new Emp(1,"jack",33,"男",5000));
        list.add(new Emp(2,"boss",55,"男",55000));
        list.add(new Emp(3,"marry",22,"女",3500));
        list.add(new Emp(4,"kate",25,"女",6000));
        list.add(new Emp(5,"tom",32,"男",8500));
        /*
         * 生成一個xml的基本步驟:
         * 1:創建文檔對象Document
         * 2:爲Document創建根節點
         * 3:爲跟節點組建樹狀結構
         * 4:創建XMLWriter
         * 6:寫出XML
         */
        //1:創建文檔對象Document
        Document doc = DocumentHelper.createDocument();
        //2:爲Document創建根節點
        /*
         * Document的方法
         * Element addElement(String name)
         * 該方法用於向文檔中添加給定名字的根元素,返回的Element實例就表示該根元素
         * 注意:該方法只能調用一次,調用第二次會拋出異常
         */
        Element root = doc.addElement("list");
        //循環添加每個員工信息
        //for(int i=0;i<list.size();i++){}
        for(Emp e : list){
            /*
             * Element同樣支持方法:
             * Element  addElement(String name)
             * 想當前標籤中添加給定名字的子標籤
             */
            //向根標籤中添加emp標籤
            Element emp = root.addElement("emp");
            //向emp標籤中添加子標籤name
            Element name = emp.addElement("name");
            name.setText(e.getName());//setText:設置;  AddText:現有內容上追加
            emp.addElement("age").setText(e.getAge()+"");
            emp.addElement("gender").addText(e.getGender());
            emp.addElement("salary").addText(e.getSalary()+"");
            /*
             * 爲標籤添加屬性
             * Element addAttribute(String name,String value)
             * 爲當前標籤添加名字和對應的值,
             * 返回值仍然是當前標籤。
             * 這樣可以連續添加若干屬性,就像StringBuilder的append的返回值效果和作用
             */
            emp.addAttribute("id", e.getId()+"");
        }
        /*
         * 當退出循環後,那麼Document中的結構就構建完 了。
         * 需要將其寫出爲xml
         */
        try{
            XMLWriter writer = new XMLWriter();
            FileOutputStream out = new FileOutputStream("myemp.xml");
            writer.setOutputStream(out);
            /*
             * 將Document對象寫出到文件中,
             * 這時會將Document轉換爲xml格式,寫入文件
             */
            writer.write(doc);
        }catch(Exception e){
        }
    }

}
package day20150924;

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

import org.dom4j.Attribute;
import org.dom4j.Document;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
/**
 * DOM4J對XPath的支持
 */
public class XMLDemo3 {
    public static void main(String[] args){
        try{
            SAXReader reader = new SAXReader();
            Document doc = reader.read(new File("myemp.xml"));
//          String path = "/list/emp[salary>5000]";
            String path2 = "/list/emp/@id";//或者 "//@id"
//          String path = "/list/emp[gender='女']";
            //String path = "/list/emp[gender='女']/salary";
            String path = "/list/emp[gender='女']/salary[.>4000]";
            /*
             * List selectNodes(String xpath)
             * 根據給定的XPATH查詢對應的節點
             */
            List list = doc.selectNodes(path);//返回Element集合
            List list2 = doc.selectNodes(path2);//返回Attribute集合
            for(Object o : list){
                Element e = (Element)o;
                String value = e.getStringValue();
                System.out.println(value);
            }
            for(Object o : list2){
                Attribute a = (Attribute)o;
                String value = a.getStringValue();
                String name = a.getName();
                System.out.println(name+",,,"+value);
            }
        }catch(Exception e){

        }
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章