Files
LABS_EDUCATION/lr10/task_2/e1.java
2026-04-05 21:23:04 +05:00

166 lines
7.1 KiB
Java
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
package lr10.task_2;
import org.w3c.dom.*;
import javax.xml.parsers.*;
import javax.xml.transform.*;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;
import java.io.File;
import java.util.List;
import java.util.Scanner;
import java.util.stream.Collectors;
import java.util.stream.IntStream;
public class e1 {
private static final String FILE_PATH = "lr10/task_2/movies.xml";
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in, "cp866");
while (true) {
System.out.println("\n=== Управление каталогом фильмов ===");
System.out.println("1. Добавить новый фильм");
System.out.println("2. Найти фильм (по режиссеру или году)");
System.out.println("3. Удалить фильм (по названию)");
System.out.println("0. Выход");
System.out.print("Выберите действие: ");
String choice = scanner.nextLine();
try {
switch (choice) {
case "1":
System.out.print("Введите название фильма: ");
String title = scanner.nextLine();
System.out.print("Введите режиссера: ");
String director = scanner.nextLine();
System.out.print("Введите год: ");
String year = scanner.nextLine();
addMovie(title, director, year);
break;
case "2":
System.out.print("Введите режиссера или год для поиска: ");
String query = scanner.nextLine();
searchMovie(query);
break;
case "3":
System.out.print("Введите точное название фильма для удаления: ");
String titleToDelete = scanner.nextLine();
deleteMovie(titleToDelete);
break;
case "0":
System.out.println("Завершение работы.");
return;
default:
System.out.println("Неверная команда!");
}
} catch (Exception e) {
System.out.println("Произошла ошибка: " + e.getMessage());
e.printStackTrace();
}
}
}
private static Document getDocument() throws Exception {
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = factory.newDocumentBuilder();
return builder.parse(new File(FILE_PATH));
}
private static void saveXML(Document doc) throws Exception {
doc.normalizeDocument();
Transformer transformer = TransformerFactory.newInstance().newTransformer();
transformer.setOutputProperty(OutputKeys.ENCODING, "UTF-8");
transformer.setOutputProperty(OutputKeys.STANDALONE, "yes");
transformer.setOutputProperty(OutputKeys.INDENT, "yes");
transformer.setOutputProperty("{http://xml.apache.org/xslt}indent-amount", "4");
DOMSource source = new DOMSource(doc);
StreamResult result = new StreamResult(new File(FILE_PATH));
transformer.transform(source, result);
}
// 1. Добавление фильма
private static void addMovie(String title, String director, String year) throws Exception {
Document doc = getDocument();
Element rootElement = doc.getDocumentElement();
Element newMovie = doc.createElement("movie");
Element titleElem = doc.createElement("title");
titleElem.appendChild(doc.createTextNode(title));
newMovie.appendChild(titleElem);
Element directorElem = doc.createElement("director");
directorElem.appendChild(doc.createTextNode(director));
newMovie.appendChild(directorElem);
Element yearElem = doc.createElement("year");
yearElem.appendChild(doc.createTextNode(year));
newMovie.appendChild(yearElem);
rootElement.appendChild(newMovie);
saveXML(doc);
System.out.println("✅ Фильм успешно добавлен!");
}
// 2. Поиск фильма
private static void searchMovie(String query) throws Exception {
Document doc = getDocument();
NodeList nodeList = doc.getElementsByTagName("movie");
List<Element> foundMovies = IntStream.range(0, nodeList.getLength())
.mapToObj(nodeList::item)
.filter(node -> node.getNodeType() == Node.ELEMENT_NODE)
.map(node -> (Element) node)
.filter(element -> {
String director = element.getElementsByTagName("director").item(0).getTextContent();
String year = element.getElementsByTagName("year").item(0).getTextContent();
return director.equalsIgnoreCase(query) || year.equals(query);
})
.collect(Collectors.toList());
if (foundMovies.isEmpty()) {
System.out.println("❌ По вашему запросу ничего не найдено.");
} else {
System.out.println("\n--- Результаты поиска ---");
for (Element el : foundMovies) {
System.out.println("Название: " + el.getElementsByTagName("title").item(0).getTextContent());
System.out.println("Режиссер: " + el.getElementsByTagName("director").item(0).getTextContent());
System.out.println("Год: " + el.getElementsByTagName("year").item(0).getTextContent());
System.out.println("-------------------------");
}
}
}
// 3. Удаление фильма
private static void deleteMovie(String title) throws Exception {
Document doc = getDocument();
NodeList nodeList = doc.getElementsByTagName("movie");
boolean isDeleted = false;
for (int i = 0; i < nodeList.getLength(); i++) {
Node node = nodeList.item(i);
if (node.getNodeType() == Node.ELEMENT_NODE) {
Element element = (Element) node;
String currentTitle = element.getElementsByTagName("title").item(0).getTextContent();
if (currentTitle.equalsIgnoreCase(title)) {
Node parentNode = element.getParentNode();
parentNode.removeChild(element);
isDeleted = true;
break;
}
}
}
if (isDeleted) {
saveXML(doc);
System.out.println("✅ Фильм '" + title + "' успешно удален!");
} else {
System.out.println("❌ Фильм с таким названием не найден.");
}
}
}