JDOM предоставляет удобный и довольно простой API для обработки XML файлов, а именно чтения, записи и редактирования XML файлов. В этой статье мы рассмотрим считывание уже существующего XML файла в Java объект.
JDOM Parser не является частью стандартного JDK, поэтому для использования JDOM нужно будет скачать Jar файл с официального сайта и добавить его в проект. Я использую maven, поэтому просто добавлю в зависимости следующий код:
1 2 3 4 5 6 7 |
<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); } } |
Запустим программу и увидим вывод в консоль:
1 2 3 |
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
. Для того, чтобы протестировать каждый из них, просто замените следующую строчку программы, как показано ниже:
1 2 3 4 5 6 7 8 9 |
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.
Подписывайтесь на рассылку и следите за новыми статьями из раздела Работа с XML на Java.