1. 程式人生 > >12、使用java的Dom4J解析XML

12、使用java的Dom4J解析XML

學習目標:

1、瞭解Java的歷史

2、為什麼要學習Java語言

3、端正學習態度

 

學習過程:

這節課我們使用java解析XML檔案,並封裝到java物件中。這也是以後的重點內容。

一、封裝物件

我們還是使用昨天的例子:

“課室裡面有兩個學生和一個老師,學生有姓名,年齡,地址等屬性,地址分為省和市來表示,老師有姓名和任課專案,每一個學生和老師都有一個Id一個學生只能有一個姓名, 年齡。地址可以有多個。”

對於這個例子,昨天我們已經使用XML進行結構化儲存了,現在我們再次使用javaBean物件對其進行封裝。新建一個com.pojo包,在這個包中建立javaBean物件。

1、新建一個老師類Teacher。程式碼如下:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

  public class Teacher {

    private String name;

    private String source;

    public String getName() {

        return name;

    }

    public void setName(String name) {

        this.name = name;

    }

    public

 String getSource() {

        return source;

    }

    public void setSource(String source) {

        this.source = source;

    }

}

2、新建一個地址類Address。程式碼如下:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

public class Address {

    private String province;

    private String city;

    public String getProvince() {

        return province;

    }

    public void setProvince(String province) {

        this.province = province;

    }

    public String getCity() {

        return city;

    }

    public void setCity(String city) {

        this.city = city;

    }

}

3、新建一個學生類Student。程式碼如下:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

public class Student {

    private String name;

    private int age;

    private List<Address> addresses;

    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 List<Address> getAddresses() {

        return addresses;

    }

    public void setAddresses(List<Address> addresses) {

        this.addresses = addresses;

    }

}

4、新建課室類Room。程式碼如下:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

 public class Room {

    private Teacher teacher;

    private List<Student> students;

    public Teacher getTeacher() {

        return teacher;

    }

    public void setTeacher(Teacher teacher) {

        this.teacher = teacher;

    }

    public List<Student> getStudents() {

        return students;

    }

    public void setStudents(List<Student> students) {

        this.students = students;

    }

}

二、準備工作,使用第三方包

我們先使用Dom的方式解析XML,XML是一個具有結構化的文件,如果我們使用原始的IO流的方式解析就會很麻煩,也不能很好發揮XML的特點,JDK中也並沒有提供解析XML的實現類,但是有很多第三方包的實現,我們可以利用這些第三方包的實現輕鬆的解析XML檔案。

1、下載Dom4j.jar。首先你得上網下載這個jar包。

2、匯入這個包。

步驟:

(1)建立一個lib的資料夾

attcontent/81e2abec-ad94-4a57-995e-ccc74960adef.png

(2)把要匯入的包複製進來

attcontent/7623fb21-cfef-452c-9a6f-5d6b61fe8725.png

(3)選中包,點選右鍵,選中Build Path ,點選add to Build path。

attcontent/75eaa610-b5da-4729-875e-41eb14a5bea9.png

 

 

三、解析並封裝XML檔案

匯入了Dom4j.jar包後我們就可以使用這個包的實現類,解析XML檔案了。新建一個com.dao包,建立ReadXML類,實現解析XML,並把解析的結果封裝到javaBean物件中。實現程式碼如下:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

public class ReadXML {

 

    // 解析XML

    public Room read() throws DocumentException {

        Room room = new Room();

        Teacher teacher = new Teacher();

        List<Student> students = new ArrayList<Student>();

 

        // 1、把XMl載入到記憶體中。

        SAXReader reader = new SAXReader();

        Document document = reader.read("./xml/room2.xml");

 

        // 2、先讀取根元素 Element

        Element rootElement = document.getRootElement();

 

        // 3、根據根元素獲得其子元素

        Element teacherElement = rootElement.element("teacher");

        teacher.setName(teacherElement.elementText("name"));

        teacher.setSource(teacherElement.elementText("source"));

        // System.out.println(teacherElement.elementText("name"));

 

        /*

          Element nameElement =teacherElement.element("name");

          System.out.println(nameElement.getText());

         */

        // 解析多個元素

        List<Element> studentsElements = rootElement.elements("student");

        for (int i = 0; i < studentsElements.size(); i++) {

            Element studentElement = studentsElements.get(i);

            Student student = new Student();

 

            student.setName(studentElement.elementText("name"));

            student.setAge(Integer.parseInt(studentElement.elementText("age")));

 

            // 解析多個元素

            List<Element> addressesElements = studentElement

                    .elements("address");

            List<Address> addresses = new ArrayList<Address>();

            for (int j = 0; j < addressesElements.size(); j++) {

                Element addressElement = addressesElements.get(j);

                Address address = new Address();

                address.setProvince(addressElement.elementText("province"));

                address.setCity(addressElement.elementText("city"));

 

                // 新增到list中

                addresses.add(address);

 

            }

            student.setAddresses(addresses);

 

            students.add(student);

        }

 

        room.setStudents(students);

        room.setTeacher(teacher);

        return room;

 

    }

 

 

}

在這個類中寫一個main方法測試。

1

2

3

4

5

6

7

8

9

10

11

12

13

 public static void main(String[] args) {

        ReadXML readXML = new ReadXML();

        try {

            Room room = readXML.read();

            System.out.println("教師的姓名:"+room.getTeacher().getName());

            System.out.println("學生物件:"+room.getStudents().size());

            System.out.println("第一個學生的姓名"+room.getStudents().get(0).getName());

             

        catch (DocumentException e) {

            // TODO Auto-generated catch block

            e.printStackTrace();

        }

    }

這時候你可以非常方便的獲得XML檔案的資訊了。