Java 操作Xml文件

在eclipse中建立maven項(xiàng)目,會(huì)自動(dòng)生成各個(gè)文件夾和配置文件
需要讀取xml文件,要導(dǎo)入包 dom4j,在文件pom.xml中配置下面這項(xiàng),注意,要寫在<project></project>標(biāo)簽中間。

<dependencies>
    <dependency>
        <groupId>dom4j</groupId>
        <artifactId>dom4j</artifactId>
        <version>1.6.1</version>
    </dependency>
</dependencies>

讀取xml文件,轉(zhuǎn)換為對(duì)象保存在內(nèi)存中

emplist.xml,是需要讀取的xml文件

<?xml version="1.0" encoding="UTF-8"?>
<list>
    <emp id="1">
        <name>one</name>
        <age>22</age>
        <gender>男</gender>
        <salary>1500</salary>
    </emp>
    <emp id="2">
        <name>two</name>
        <age>23</age>
        <gender>男</gender>
        <salary>3000</salary>
    </emp>
    <emp id="3">
        <name>three</name>
        <age>23</age>
        <gender>男</gender>
        <salary>3500</salary>
    </emp>
</list>

將上面xml信息,實(shí)例化的實(shí)體類

package day12;

 * 該類用于表示xml文檔中的一個(gè)員工信息
public class Emp {
    private int id;
    private String name;
    private int age;
    private String gender;
    private int salary;
    
    ---- 省略get,set方法
    public Emp() {}

    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 String toString() {
        return id+","+name+","+age+","+gender+","+salary;
    }
}

處理程序

package day12;

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

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

 * 使用DOM解析xml文檔
public class ParseXmlDemo {
    public static void main(String[] args) {

         * 解析emplist.xml文檔,將所有的員工信息讀取
         * 出來并轉(zhuǎn)換為若干Emp實(shí)例,存入一個(gè)List集合中
         * 
         * 解析XML的流程:
         * 1. 創(chuàng)建SAXReader
         * 2. 使用SAXReader讀取XML文檔并返回Document對(duì)象
         *  Document對(duì)象
         *  這一步就是DOM解析耗時(shí)耗資源的體現(xiàn)
         *  因?yàn)镈OM會(huì)將XML文檔全部讀取并以一個(gè)Document對(duì)象形式存于內(nèi)存。
         *  Document對(duì)象用于描述解析的XML文檔內(nèi)容。
         * 3. 根據(jù)Document對(duì)象獲取根元素
         * 4. 按照xml的結(jié)構(gòu)從根元素中開始逐級(jí)獲取子元素以達(dá)到遍歷xml的目的
        
        try {
             * 1
            SAXReader reader = new SAXReader();
             * 2
            Document doc = reader.read(new FileInputStream("emplist.xml"));

             * 3. 獲取根元素
             * Element的每一個(gè)實(shí)例用于表示xml文檔中的一個(gè)元素(一個(gè)標(biāo)簽)
             * 這里獲取的相當(dāng)于emplist.xml文檔中的<List>標(biāo)簽
             *
             *Element提供了獲取元素的相關(guān)方法:
             *
             *String getName()  --獲取當(dāng)前標(biāo)簽的名字
             *List elements()   --獲取當(dāng)前標(biāo)簽下的所有子標(biāo)簽
             *List element(String name)    --獲取當(dāng)前標(biāo)簽下所有同名子標(biāo)簽
             *Element element(String name) --獲取指定名字的子標(biāo)簽
             *Attribute attribute(String name) --獲取指定名字的屬性,getName(),getValue()
             *
             *String getText()  --獲取當(dāng)前標(biāo)簽中的文本
             *(前標(biāo)簽和后標(biāo)簽中間的文本信息,前提是確實(shí)為文本而不是子標(biāo)簽)     

            Element root = doc.getRootElement();
            List<Emp> emplist = new ArrayList<Emp>();
            
            // 獲取根標(biāo)簽<list>下面的所有子標(biāo)簽<emp>
            List<Element> elements = root.elements();
            

             * 遍歷所有<Emp>標(biāo)簽并解析出該員工相關(guān)信息并以一個(gè)Emp實(shí)例
             * 保存然后將其存入emplist集合

            for(Element empEle: elements) {
                int id = Integer.parseInt(empEle.attribute("id").getValue());
                String name = empEle.elementText("name");
                int age = Integer.parseInt(empEle.elementText("age"));
                String gender = empEle.elementText("gender");
                int salary = Integer.parseInt(empEle.elementText("salary"));
                
                Emp emp = new Emp(id,name,age,gender,salary);
                emplist.add(emp);
            }
            
            System.out.println("解析完畢");
            System.out.println("共有"+emplist.size()+"個(gè)員工");
            for(Emp e:emplist) {
                System.out.println(e);
            }
            System.out.println(emplist);
        }catch (Exception e) {
            e.printStackTrace();
        }
    }
}

打印結(jié)果:
解析完畢
共有3個(gè)員工
1,one,22,男,1500
2,two,23,男,3000
3,three,23,男,3500
[1,one,22,男,1500, 2,two,23,男,3000, 3,three,23,男,3500]

將對(duì)象轉(zhuǎn)換為xml文件

要注意把Emp類放在同一個(gè)包下

package day12;

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

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

 * 使用DOM生成xml文檔
public class WriteXmlDemo {
    public static void main(String[] args) {
        List<Emp> emplist = new ArrayList<Emp>();
        emplist.add(new Emp(1,"one",22,"男",1200));
        emplist.add(new Emp(2,"two",23,"男",2400));
        emplist.add(new Emp(3,"three",24,"男",4800));
        emplist.add(new Emp(4,"four",25,"男",9600));
        emplist.add(new Emp(5,"five",26,"男",19200));
        
         * 將emplist集合中的員工信息保存到myemp.xml文檔中。

         * 寫出XML文檔的步驟:
         * 1. 創(chuàng)建一個(gè)Document對(duì)象表示一個(gè)空白的xml文檔
         * 2. 向Document對(duì)象中添加根元素
         * 3. 按照應(yīng)當(dāng)生成的xml文檔的格式逐級(jí)向根元素中添加子元素以形成xml文檔格式
         * 4. 創(chuàng)建XmlWriter
         * 5. 通過XmlWriter將Document寫出

        XMLWriter writer = null;
        try {
            Document document = DocumentHelper.createDocument();

             * 添加根標(biāo)簽<list>
             * Document提供了根元素的方法
             * 
             * Element addElement(String name)
             * 該方法可以向當(dāng)前文檔中添加給定名字的根元素,并將添加進(jìn)入的
             * 元素以一個(gè)Element實(shí)例返回,以便于對(duì)該元素繼續(xù)操作。
             * 需要注意,該方法只能調(diào)用一次,因?yàn)橐粋€(gè)文檔中的根元素只能有一個(gè)。

            Element root = document.addElement("list");
            
            for(Emp emp:emplist) {
                 * Element addElement(String name)
                 * 向當(dāng)前標(biāo)簽中添加給定名字的子標(biāo)簽并將其返回,以便繼續(xù)操作
                 * 
                 * Element addText(String text)
                 * 向當(dāng)前標(biāo)簽中添加文本信息,返回值為當(dāng)前文檔標(biāo)簽
                 * 
                 * Element addAttribute(String name,String value)
                 * 向當(dāng)前標(biāo)簽中添加屬性,返回值為當(dāng)前標(biāo)簽

                Element empEle = root.addElement("emp");
                empEle.addAttribute("id", String.valueOf(emp.getId()));
                empEle.addElement("name").addText(emp.getName());
                empEle.addElement("gender").addText(emp.getGender());
                empEle.addElement("salary").addText(String.valueOf(emp.getSalary()));
            }
            
            FileOutputStream fos = new FileOutputStream("myemp.xml");
            writer = new XMLWriter(fos,OutputFormat.createPrettyPrint());
            * OutputFormat.createPrettyPrint() 
            * 不加這句輸出結(jié)果是在一行顯示的,加上會(huì)格式化寫入,也就是有縮進(jìn)的代碼模式
            writer.write(document);
            System.out.println("寫出完畢!");
            
        }catch(Exception e){
            e.printStackTrace();
        }finally {
            if(writer != null) {
                try {
                    writer.close();
                    System.out.println("關(guān)閉文件流");
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}
打印結(jié)果:
寫出完畢!
關(guān)閉文件流

最終輸出的myemp.xml文件

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

<list>
    <emp id="1">
        <name>one</name>
        <gender>男</gender>
        <salary>1200</salary>
    </emp>
    <emp id="2">
        <name>two</name>
        <gender>男</gender>
        <salary>2400</salary>
    </emp>
    <emp id="3">
        <name>three</name>
        <gender>男</gender>
        <salary>4800</salary>
    </emp>
    <emp id="4">
        <name>four</name>
        <gender>男</gender>
        <salary>9600</salary>
    </emp>
    <emp id="5">
        <name>five</name>
        <gender>男</gender>
        <salary>19200</salary>
    </emp>
</list>

java Xpath 的使用

記得在maven中引入包 jaxen,添加如下

<dependency>
    <groupId>jaxen</groupId>
    <artifactId>jaxen</artifactId>
    <version>1.1.6</version>
</dependency>

使用Xpath檢索XML數(shù)據(jù)

package day12;

import java.io.FileInputStream;
import java.util.List;

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

 * 使用Xpath檢索XML數(shù)據(jù)
public class XpathDemo {
    public static void main(String[] args) {
        try {
            SAXReader reader = new SAXReader();
            Document doc = reader.read(new FileInputStream("myemp.xml"));

             * Document支持使用xpath檢索數(shù)據(jù),前提是必須引入jaxen這個(gè)jar

            String xpath = "/list/emp[gender='男']/name";
            List<Element> list = doc.selectNodes(xpath);
            for(Element ele:list) {
                System.out.println(ele.getName()+":"+ele.getText());
            }
        }catch (Exception e) {
            System.out.println(e.getMessage());
        }
    }
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Spring Boot 參考指南 介紹 轉(zhuǎn)載自:https://www.gitbook.com/book/qbgb...
    毛宇鵬閱讀 47,281評(píng)論 6 342
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,654評(píng)論 19 139
  • 入門 介紹 Spring Boot Spring Boot 使您可以輕松地創(chuàng)建獨(dú)立的、生產(chǎn)級(jí)的基于 Spring ...
    Hsinwong閱讀 17,099評(píng)論 2 89
  • 采桑子 · 湘湖游記 不到湘湖未曾看 入了歧途,忘了歸途 碧水輕舟映越都 江南煙雨春方盡 不似西湖,更勝西湖 湖光...
    伯顏817閱讀 458評(píng)論 0 0
  • 存在主義 1.存在先于本質(zhì) 2.世界是荒誕的,人生是痛苦悲劇的 3.人是自由選擇的 《內(nèi)向者優(yōu)勢(shì)》 《局外人》 電...
    清醒不了的人閱讀 219評(píng)論 0 0

友情鏈接更多精彩內(nèi)容