dom4j解析xml

DOM解析原理:xml解析器一次性把整個xml文檔加載進內存蚁滋,然后在內存中構建一顆Document的對象樹旺嬉,通過Document對象馆揉,得到樹上的節(jié)點對象既穆,通過節(jié)點對象訪問(操作)到xml文檔的內容讶隐。

  1. 在src目錄下建立一個lib包起胰,將dom4j-1.6.1.jar這個jar包放在該目錄下(該jar包可在網(wǎng)上下載),右擊在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:創(chuàng)建SAXReader
     * 2:使用SAXReader讀取xml文檔戒劫,并生成文檔的Document對象半夷,該對象保存了該文檔所有數(shù)據(jù)及結構。
     *  這一步也是DOM解析耗時消耗資源的地方
     * 3:通過Document對象獲取根元素
     * 4:按照XML文檔的結構從跟元素開始逐步獲取子元素以達到遍歷XML文檔數(shù)據(jù)的目的巫橄。
     */
    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:創(chuàng)建一個Document對象盯质,表示一個空白文檔
     * 2:向Document中添加根元素
     * 3:創(chuàng)建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下的包呼巷,如果沒有正確導入對應的包可能會報錯,或出現(xiàn)其他不理想的情況赎瑰。
2王悍、XMLWriter構造方法中加入?yún)?shù)OutputFormat.createPrettyPrint(),生成的帶有格式化的xml文件餐曼,如果不加压储,則生成的xml文件內容在一行。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末源譬,一起剝皮案震驚了整個濱河市集惋,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌踩娘,老刑警劉巖刮刑,帶你破解...
    沈念sama閱讀 218,607評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異养渴,居然都是意外死亡雷绢,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,239評論 3 395
  • 文/潘曉璐 我一進店門理卑,熙熙樓的掌柜王于貴愁眉苦臉地迎上來翘紊,“玉大人,你說我怎么就攤上這事藐唠∠枷” “怎么了孵滞?”我有些...
    開封第一講書人閱讀 164,960評論 0 355
  • 文/不壞的土叔 我叫張陵,是天一觀的道長鸯匹。 經(jīng)常有香客問我,道長泄伪,這世上最難降的妖魔是什么殴蓬? 我笑而不...
    開封第一講書人閱讀 58,750評論 1 294
  • 正文 為了忘掉前任,我火速辦了婚禮蟋滴,結果婚禮上染厅,老公的妹妹穿的比我還像新娘。我一直安慰自己津函,他們只是感情好肖粮,可當我...
    茶點故事閱讀 67,764評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著尔苦,像睡著了一般涩馆。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上允坚,一...
    開封第一講書人閱讀 51,604評論 1 305
  • 那天魂那,我揣著相機與錄音,去河邊找鬼稠项。 笑死涯雅,一個胖子當著我的面吹牛,可吹牛的內容都是我干的展运。 我是一名探鬼主播活逆,決...
    沈念sama閱讀 40,347評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼拗胜!你這毒婦竟也來了蔗候?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 39,253評論 0 276
  • 序言:老撾萬榮一對情侶失蹤挤土,失蹤者是張志新(化名)和其女友劉穎琴庵,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體仰美,經(jīng)...
    沈念sama閱讀 45,702評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡迷殿,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,893評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了咖杂。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片庆寺。...
    茶點故事閱讀 40,015評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖诉字,靈堂內的尸體忽然破棺而出懦尝,到底是詐尸還是另有隱情知纷,我是刑警寧澤,帶...
    沈念sama閱讀 35,734評論 5 346
  • 正文 年R本政府宣布陵霉,位于F島的核電站琅轧,受9級特大地震影響,放射性物質發(fā)生泄漏踊挠。R本人自食惡果不足惜乍桂,卻給世界環(huán)境...
    茶點故事閱讀 41,352評論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望效床。 院中可真熱鬧睹酌,春花似錦、人聲如沸剩檀。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,934評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽沪猴。三九已至辐啄,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間字币,已是汗流浹背则披。 一陣腳步聲響...
    開封第一講書人閱讀 33,052評論 1 270
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留洗出,地道東北人士复。 一個月前我還...
    沈念sama閱讀 48,216評論 3 371
  • 正文 我出身青樓,卻偏偏與公主長得像翩活,于是被迫代替她去往敵國和親阱洪。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,969評論 2 355