You are on page 1of 11

МІНІСТЕРСТВО ОСВІТИ І НАУКИ УКРАЇНИ

НАЦІОНАЛЬНИЙ УНІВЕРСИТЕТ «ОДЕСЬКА ПОЛІТЕХНІКА»


ІНСТИТУТ КОМП’ЮТЕРНИХ СИСТЕМ
КАФЕДРА ІНЖЕНЕРІЇ ПРОГРАМНОГО ЗАБЕЗПЕЧЕННЯ

Лабораторна робота №4
із дисципліни «Web-сервіси на Java EE»

Виконав:
ст. ІV курсу гр. АС-201
Поцілуйко В. А.

Перевірила:
д. Прокоп Ю. В.

Посилання
на демонстрацію:
https://drive.google.com/file/d/1fFJGgM6W9TBTE0nYoGcEf_2MSWsGtwRi/view?us
p=sharing

Одеса 2023
2

ЗМІСТ

ВСТУП.............................................................................................................................. 3

1 ПРОГРАМНИЙ КОД ................................................................................................... 4

2 ТЕСТУВАННЯ ............................................................................................................. 9

2.1 Прохід по документу ............................................................................................ 9

2.2 Модифікація документа ...................................................................................... 10

ВИСНОВОК ................................................................................................................... 11
3

ВСТУП

Тема: «Розбір XML документу за допомогою DOM та JAXB парсерів».


Мета: Оволодіти різними видами технологій обробки даних у веб-сервісах,
та інструментами DOM та JAXB для автоматизації цього процесу..
Завдання:
1. Виконати прохід по документу.
2. Змінити документ (за варіантом).
Варіант: Додавання вузла в 3 вузол документа. Наприклад: в документі
існує 5 вузлів «message», необхідно додати в вузол «message» вузол «info». Вузол
«info» повинен бути доданий тільки в 3-ий вузол «message», а не у всі з них.
Посилання на демонстрацію:
https://drive.google.com/file/d/1fFJGgM6W9TBTE0nYoGcEf_2MSWsGtwRi/view?us
p=sharing
4

1 ПРОГРАМНИЙ КОД

Код програми, яка виконує операції за умовою завдання, а саме прохід


документа за допомогою інструменту DOM та його модифікацію з використанням
JAXB і надано у лістингу 1.1.

Лістинг 1.1 – Програмний код


package lab4;

import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import org.w3c.dom.*;
import org.xml.sax.InputSource;

import javax.swing.*;
import javax.xml.parsers.*;
import java.io.StringReader;
import java.text.SimpleDateFormat;
import java.util.Date;
import javax.swing.tree.DefaultMutableTreeNode;
import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBException;
import javax.xml.bind.Marshaller;
import javax.xml.bind.Unmarshaller;
import org.xml.sax.SAXException;

public class Lab4 {

private static int ACTION_VIEW = 0;


private static int ACTION_MODIFY = 1;

private static JFrame frame;

public static void main(String[] args) {


5
SwingUtilities.invokeLater(() -> {
// Створюємо форму
frame = new JFrame("Лабораторна робота №4");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
// Створюємо кнопку для проходу XML-файлу за допомогою DOM
JButton viewButton = new JButton("Пройти файл за допомогою DOM");
viewButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
loadXML(ACTION_VIEW);
}
});

// Створюємо кнопку для модифікації XML-файлу за допомогою JAXB


JButton modifyButton = new JButton("Модифікувати за допомогою JAXB");
modifyButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
loadXML(ACTION_MODIFY);
}
});

// Додаємо кнопки до форми


frame.getContentPane().setLayout(new GridLayout(2, 1, 30, 30));
frame.getContentPane().add(viewButton);
frame.getContentPane().add(modifyButton);
// Відображаємо форму
FrameUtil.showFrame(frame, 400, 200);
});
}

// Метод, що завантажує вміст XML-файлу та виконує на ним певну дію


private static void loadXML(int action){
JFileChooser fileChooser = new JFileChooser();
// Відображаємо діалог вибору файла
int result = fileChooser.showOpenDialog(null);
if (result != JFileChooser.APPROVE_OPTION) return;
File selectedFile = fileChooser.getSelectedFile();
try {
// Зчитуємо вміст файлу до рядка
String xmlString = loadFileToString(selectedFile);
// Виконуємо запитувану дію
6
if (action == ACTION_VIEW){
handleViewAction(xmlString);
}
else if (action == ACTION_MODIFY){
handleModifyAction(selectedFile, xmlString);
}

} catch (Exception ex) {


ex.printStackTrace();
JOptionPane.showMessageDialog(frame, "Помилка при зчитуванні файлу!");
}
}

// Метод, що виконує прохід документа за допомогою DOM


private static void handleViewAction(String xmlString) throws
ParserConfigurationException, SAXException, IOException {
// Створюємо екземпляр будівельника документу
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = factory.newDocumentBuilder();
// Переводимо XML у DOM
InputSource is = new InputSource(new StringReader(xmlString));
Document document = builder.parse(is);
// Будуємо інтерфейс користувача
SwingUtilities.invokeLater(() -> {
// Створюємо елемент користувацького інтерфейсу "Дерево"
DefaultMutableTreeNode rootNode = new
DefaultMutableTreeNode(document.getDocumentElement().getTagName());
JTree tree = new JTree(rootNode);
// Заповнюємо дерево дочірніми вузлами корененвого елементу XML-файлу
populateTreeView(document.getDocumentElement(), rootNode);
TreeUtil.expandAllNodes(tree);
// Відображаємо отримане дерево у вікні
JFrame viewFrame = new JFrame("Прохід документа");
viewFrame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
viewFrame.getContentPane().add(new JScrollPane(tree));
FrameUtil.showFrame(viewFrame, 1200, 500);
});
}

// Метод, що виконує модифікацію документа за допомогою JAXB


private static void handleModifyAction(File file, String xml) throws
JAXBException {
7
JAXBContext context = JAXBContext.newInstance(MessageList.class);
// Перетворюємо XML на об'єкти Java
Unmarshaller unmarshaller = context.createUnmarshaller();
MessageList messageList = (MessageList) unmarshaller.unmarshal(new
StringReader(xml));
// Модифікуємо об'єкти, відповідно до завдання
Message[] messages = messageList.getMessages();
if (messages != null && messages.length >= 3) {
Message thirdMessage = messages[2];
Date date = new Date();
Info info = new Info();
info.setDate(new SimpleDateFormat("dd MMMM yyyy р.").format(date));
info.setTime(new SimpleDateFormat("HH:mm:ss").format(date));
thirdMessage.setInfo(info);
}
// Перетворюємо об'єкти назад у XML
Marshaller marshaller = context.createMarshaller();
marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
marshaller.marshal(messageList, file);
JOptionPane.showMessageDialog(frame, "XML-файл змінено!");
}

// Метод, що завантажує вміст файлу до символьного рядка


private static String loadFileToString(File file) throws Exception {
StringBuilder content = new StringBuilder();
try (BufferedReader reader = new BufferedReader(new FileReader(file))) {
String line;
while ((line = reader.readLine()) != null) {
content.append(line).append("\n");
}
}
return content.toString();
}

// Метод, що додає структуру елементів, дочірніх до parentElement, до вузла


parentTreeNode
private static void populateTreeView(Element parentElement,
DefaultMutableTreeNode parentTreeNode) {
// Отримуємо дочірні вузли
NodeList childNodes = parentElement.getChildNodes();
// Проводимо аналіз кожного з них
for (int i = 0; i < childNodes.getLength(); i++) {
8
// Витягаємо поточний дочірній вузол
Node node = childNodes.item(i);
int type = node.getNodeType(); //тип елемента
/* Якщо він є елементом, то додаємо його назву до дерева та
повторюємо виклик даного методу для його дочірніх вузлів (рекурсія)
*/
if (type == Node.ELEMENT_NODE) {
Element childElement = (Element) node;
DefaultMutableTreeNode childTreeNode = new
DefaultMutableTreeNode(childElement.getTagName());
parentTreeNode.add(childTreeNode);
populateTreeView(childElement, childTreeNode);
}
/* Якщо вузол представляє текст, то даний текст просто додаємо в
якості вузлового листа до його предка*/
else if (type == Node.TEXT_NODE){
String textContent = node.getTextContent();
if (!isEmpty(textContent)){ /* При розборі, символи переносу рядка
та пробіли реєструються
як окремі текстові вузли, тому
вводимо перевірку для того, щоб їх уникати*/
parentTreeNode.add(new DefaultMutableTreeNode(textContent));
}
}
}
}

// Метод, що перевіряє, чи є текст пустим


private static boolean isEmpty(String string){
return string.replaceAll("\n", "").trim().isEmpty();
}

}
9

2 ТЕСТУВАННЯ

2.1 Прохід по документу

На рис. 2.1 показано результат виконання програми для задачі проходу по


XML-документу з лабораторної роботи №1. Як видно, програма коректно аналізує
документ, і будує на його основі деревовидне представлення.

Рисунок 2.1 – Прохід по документу


10

2.2 Модифікація документа

На рис. 2.2 показано вміст цільового XML-файлу до запуску програми. На


рис. 2.3 показано вміст цього файлу після запуску програми. Як видно, завдання
за варіантом успішно виконується.

Рисунок 2.2 – Документ до модифікації

Рисунок 2.3 – Документ після модифікації


11

ВИСНОВОК

На даній лабораторній роботі я оволодів різними видами технологій


обробки даних у веб-сервісах, та інструментами DOM та JAXB для автоматизації
цього процесу.

You might also like