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