Избранное сообщение

Фетісов В. С. Комп’ютерні технології в тестуванні. Навчально-методичний посібник. 2-ге видання, перероблене та доповнене / Мои публикации

В 10-х годах я принимал участие в программе Европейского Союза Tempus "Освітні вимірювання, адаптовані до стандартів ЄС". В рамк...

Благодаря Интернету количество писателей и поэтов увеличивается в геометрической прогрессии. Поголовье читателей начинает заметно отставать.

воскресенье, 24 апреля 2016 г.

Читаем XML файл на Java с помощью JDOM Parser / Программирование на Java

JDOM предоставляет удобный и довольно простой API для обработки XML файлов, а именно чтения, записи и редактирования XML файлов. В этой статье мы рассмотрим считывание уже существующего XML файла в Java объект. 

JDOM Parser не является частью стандартного JDK, поэтому для использования JDOM нужно будет скачать Jar файл с официального сайта и добавить его в проект. Я использую maven, поэтому просто добавлю в зависимости следующий код:
<dependencies>
    <dependency>
        <groupId>org.jdom</groupId>
        <artifactId>jdom</artifactId>
        <version>2.0.2</version>
    </dependency>
</dependencies>
JDOM предоставляет четыре класса-обертки, с помощью которых мы можем получить объект JDOM Document. Сам объект JDOM Document содержит множество методов для получения корневого элемента, списка дочерних элементов, значений атрибутов и значения элемента по имени.

 JDOM предоставляет следующие классы:

  1. Класс org.jdom2.input.DOMBuilder  использует DOM Parser для разбора XML и преобразования его в JDOM Document.
  2. Класс org.jdom2.input.SAXBuilder использует SAX Parser для разбора XML и преобразования его в JDOM Document.
  3. Класс org.jdom2.input.StAXEventBuilder использует STAX Event Parser для разбора XML и преобразования его в JDOM Document.
  4. Класс org.jdom2.input.StAXStreamBuilder использует STAX Stream Parser для разбора XML и преобразования его в JDOM Document.
  5. Класс org.jdom2.Document содержит наиболее используемые методы для работы с XML: получения корневого элемента, считывания данных, редактирования и записи содержимого элементов.
  6. Класс org.jdom2.Element содержит другие часто используемые методы для получения списка дочерних элементов, значения дочерних элементов и значений атрибутов.

Пример чтения XML файла с помощью JDOM Parser

Ниже представлена программа для чтения XML файла в список объектов с помощью JDOM Parser.
Содержимое файла students.xml:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<?xml version="1.0" encoding="UTF-8"?>
<Students>
    <Student id="1">
        <name>Andrey</name>
        <age>21</age>
        <language>Java</language>
    </Student>
    <Student id="2">
        <name>Viktor</name>
        <age>20</age>
        <language>C++</language>
    </Student>
    <Student id="3">
        <name>Dima</name>
        <age>22</age>
        <language>JavaScript</language>
    </Student>
</Students>
Ниже напишем класс, который будет хранить информацию об одном элементе Student:
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
public class Student {
    private String name;
    private int age;
    private int id;
    private String language;

    @Override
    public String toString() {
        return "Student{" +
                "name='" + name + '\'' +
                ", age=" + age +
                ", id=" + id +
                ", language='" + language + '\'' +
                '}';
    }

    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 getLanguage() {
        return language;
    }

    public void setLanguage(String language) {
        this.language = language;
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }
}
Ниже представлена программа для считывания XML файла с помощью DOMBuilderSTAXParser и SAXParser в список объектов Student:
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
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
package ua.com.prologistic.jdom;

import org.jdom2.Element;
import org.jdom2.JDOMException;
import org.jdom2.input.DOMBuilder;
import org.jdom2.input.SAXBuilder;
import org.jdom2.input.StAXEventBuilder;
import org.jdom2.input.StAXStreamBuilder;
import org.w3c.dom.Document;
import org.xml.sax.SAXException;
import ua.com.prologistic.Student;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.stream.XMLEventReader;
import javax.xml.stream.XMLInputFactory;
import javax.xml.stream.XMLStreamException;
import javax.xml.stream.XMLStreamReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;


public class XMLjdomReader {

    public static void main(String[] args) {
        String fileName = "F:/students.xml";
        try {
            // мы можем создать экземпляр JDOM Document из классов DOM, SAX и STAX Builder
            org.jdom2.Document jdomDocument = createJDOMusingDOMParser(fileName);
            Element root = jdomDocument.getRootElement();
            // получаем список всех элементов Student
            List<Element> studListElements = root.getChildren("Student");
            // список объектов Student, в которых будем хранить
            // считанные данные по каждому элементу
            List<Student> students = new ArrayList<>();
            for (Element studentEl : studListElements) {
                Student student = new Student();
                student.setId(Integer.parseInt(studentEl.getAttributeValue("id")));
                student.setAge(Integer.parseInt(studentEl.getChildText("age")));
                student.setName(studentEl.getChildText("name"));
                student.setLanguage(studentEl.getChildText("language"));

                students.add(student);
            }
            // печатаем полученный список объектов Student
            for (Student student : students) {
                System.out.println(student.toString());
            }
        } catch (Exception e) {
            e.printStackTrace();
        }

    }


    // получаем экземпляр JDOM Document с помощью DOM Parser
    private static org.jdom2.Document createJDOMusingDOMParser(String fileName)
throws ParserConfigurationException, SAXException, IOException {
        //создаем DOM Document
        DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();
        DocumentBuilder documentBuilder;
        documentBuilder = dbFactory.newDocumentBuilder();
        Document doc = documentBuilder.parse(new File(fileName));
        DOMBuilder domBuilder = new DOMBuilder();

        return domBuilder.build(doc);

    }

    // получаем экземпляр JDOM Document с помощью SAX Parser
    private static org.jdom2.Document createJDOMusingSAXParser(String fileName)
throws JDOMException, IOException {
        SAXBuilder saxBuilder = new SAXBuilder();
        return saxBuilder.build(new File(fileName));
    }

    // получаем экземпляр JDOM Document с помощью STAX Stream Parser или STAX Event Parser
    private static org.jdom2.Document createJDOMusingSTAXParser(String fileName, String type)
throws FileNotFoundException, XMLStreamException, JDOMException {
        if (type.equalsIgnoreCase("stream")) {
            StAXStreamBuilder staxBuilder = new StAXStreamBuilder();
            XMLInputFactory xmlInputFactory = XMLInputFactory.newInstance();
            XMLStreamReader xmlStreamReader =
xmlInputFactory.createXMLStreamReader(new FileInputStream(fileName));
            return staxBuilder.build(xmlStreamReader);
        }
        StAXEventBuilder staxBuilder = new StAXEventBuilder();
        XMLInputFactory xmlInputFactory = XMLInputFactory.newInstance();
        XMLEventReader xmlEventReader = xmlInputFactory.createXMLEventReader(
new FileInputStream(fileName));
        return staxBuilder.build(xmlEventReader);

    }
}
Запустим программу и увидим вывод в консоль:
Student{name='Andrey', age=21, id=1, language='Java'}
Student{name='Viktor', age=20, id=2, language='C++'}
Student{name='Dima', age=22, id=3, language='JavaScript'}
Как видим, в программе остались не задействованы еще два способа получения JDOM Document. Для того, чтобы протестировать каждый из них, просто замените следующую строчку программы, как показано ниже:
org.jdom2.Document jdomDocument = createJDOMusingDOMParser(fileName);

на

org.jdom2.Document jdomDocument = createJDOMusingSAXParser(fileName);

или на

org.jdom2.Document jdomDocument = createJDOMusingSTAXParser(fileName, "stream");
Каждый из этих способов возвращает валидный JDOM Document, с которым мы можем работать уже в рамках JDOM, поэтому результат выполнения всегда будет одинаковым.
Вот такой простой пример чтения XML файла с помощью JDOM Parser и любым из DOM Parser, SAX Parser или STAX Parser.

Источник: http://prologistic.com.ua/chitaem-xml-fajl-na-java-s-pomoshh-yu-jdom-parser.html

Смотри также:

Комментариев нет:

Отправить комментарий