Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
13 changes: 13 additions & 0 deletions data/data.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
<?xml version="1.0" encoding="UTF-8" ?>
<root>
<student name="Иванов Иван Иванович">
<subject name="математика">67</subject>
<subject name="литература">100</subject>
<subject name="программирование">91</subject>
</student>
<student name="Петров Петр Петрович">
<subject name="математика">78</subject>
<subject name="химия">87</subject>
<subject name="социология">61</subject>
</student>
</root>
29 changes: 29 additions & 0 deletions src/XMLDataReader.py
Original file line number Diff line number Diff line change
@@ -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()

# Проходим по всем элементам <student>
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
50 changes: 50 additions & 0 deletions test/test_XMLDataReader.py
Original file line number Diff line number Diff line change
@@ -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 = """<?xml version="1.0" encoding="UTF-8" ?>
<root>
<student name="Иванов Иван Иванович">
<subject name="математика">67</subject>
<subject name="литература">100</subject>
<subject name="программирование">91</subject>
</student>
<student name="Петров Петр Петрович">
<subject name="математика">78</subject>
<subject name="химия">87</subject>
<subject name="социология">61</subject>
</student>
</root>"""

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]
Loading