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 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("❌ Фильм с таким названием не найден."); } } }