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 предоставляет следующие классы:
- Класс
org.jdom2.input.DOMBuilder
использует DOM Parser для разбора XML и преобразования его вJDOM Document
. - Класс
org.jdom2.input.SAXBuilder
использует SAX Parser для разбора XML и преобразования его вJDOM Document
. - Класс
org.jdom2.input.StAXEventBuilder
использует STAX Event Parser для разбора XML и преобразования его вJDOM Document
. - Класс
org.jdom2.input.StAXStreamBuilder
использует STAX Stream Parser для разбора XML и преобразования его в JDOM Document. - Класс
org.jdom2.Document
содержит наиболее используемые методы для работы с XML: получения корневого элемента, считывания данных, редактирования и записи содержимого элементов. - Класс
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 файла с помощью
DOMBuilder
, STAXParser
и 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.
Здесь мы писали в XML файл с помощью JDOM.
Источник: http://prologistic.com.ua/chitaem-xml-fajl-na-java-s-pomoshh-yu-jdom-parser.html
Смотри также:
- Двести пятьдесят русскоязычных обучающих видео докладов и лекций о Java. http://fetisovvs.blogspot.com/2015/12/java-5-java-java.html
- Шпаргалка Java программиста 7.1 Типовые задачи: Оптимальный путь преобразования InputStream в строку. http://fetisovvs.blogspot.com/2016/04/java-71-inputstream-java.html
- Как установить соединение с СУБД MySQL в IntelliJ IDEA в редакции Community. http://fetisovvs.blogspot.com/2016/04/mysql-intellij-idea-community-java.html
- Программируем… выход из лабиринта. http://fetisovvs.blogspot.com/2015/10/java.html
- Игра на чистой Java от новичка, для новичков. http://fetisovvs.blogspot.com/2015/09/java-java.html
Комментариев нет:
Отправить комментарий