diff --git a/data/data.xml b/data/data.xml
new file mode 100644
index 0000000..0f93c59
--- /dev/null
+++ b/data/data.xml
@@ -0,0 +1,13 @@
+
+
+
+ 67
+ 100
+ 91
+
+
+ 78
+ 87
+ 61
+
+
\ No newline at end of file
diff --git a/src/XMLDataReader.py b/src/XMLDataReader.py
new file mode 100644
index 0000000..d4e9015
--- /dev/null
+++ b/src/XMLDataReader.py
@@ -0,0 +1,29 @@
+# -*- coding: utf-8 -*-
+import xml.etree.ElementTree as ET
+from src.Types import DataType
+from src.DataReader import DataReader
+
+
+class XMLDataReader(DataReader):
+ def __init__(self) -> None:
+ self.key: str = ""
+ self.students: DataType = {}
+
+ def read(self, path: str) -> DataType:
+ # Открываем и парсим XML файл
+ tree = ET.parse(path)
+ root = tree.getroot()
+
+ # Проходим по всем элементам
+ for student_element in root.findall("student"):
+ self.key = student_element.get("name")
+ self.students[self.key] = []
+
+ # Проходим по всем предметам внутри студента
+ for subject_element in student_element.findall("subject"):
+ subj_name = subject_element.get("name")
+ # Текст внутри тега может содержать пробелы, чистим его
+ score = int(subject_element.text.strip())
+ self.students[self.key].append((subj_name, score))
+
+ return self.students
\ No newline at end of file
diff --git a/test/test_XMLDataReader.py b/test/test_XMLDataReader.py
new file mode 100644
index 0000000..1d315a0
--- /dev/null
+++ b/test/test_XMLDataReader.py
@@ -0,0 +1,50 @@
+# -*- coding: utf-8 -*-
+import pytest
+from src.Types import DataType
+from src.XMLDataReader import XMLDataReader
+
+
+class TestXMLDataReader:
+
+ @pytest.fixture()
+ def file_and_data_content(self) -> tuple[str, DataType]:
+ # Данные для теста
+ xml_content = """
+
+
+ 67
+ 100
+ 91
+
+
+ 78
+ 87
+ 61
+
+"""
+
+ data = {
+ "Иванов Иван Иванович": [
+ ("математика", 67), ("литература", 100), ("программирование", 91)
+ ],
+ "Петров Петр Петрович": [
+ ("математика", 78), ("химия", 87), ("социология", 61)
+ ]
+ }
+ return xml_content, data
+
+ @pytest.fixture()
+ def filepath_and_data(self, file_and_data_content: tuple[str, DataType],
+ tmpdir) -> tuple[str, DataType]:
+ # Создаем файл
+ p = tmpdir.mkdir("datadir").join("my_data.xml")
+
+ # Пишем в бинарном режиме, чтобы не было проблем с кодировкой в Windows
+ p.write(file_and_data_content[0].encode('utf-8'), mode='wb')
+
+ return str(p), file_and_data_content[1]
+
+ def test_read(self, filepath_and_data: tuple[str, DataType]) -> None:
+ # Проверяем чтение
+ file_content = XMLDataReader().read(filepath_and_data[0])
+ assert file_content == filepath_and_data[1]
\ No newline at end of file