Форум программистов, компьютерный форум, киберфорум
Наши страницы
Python
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.90/10: Рейтинг темы: голосов - 10, средняя оценка - 4.90
Zarex
54 / 54 / 16
Регистрация: 25.03.2013
Сообщений: 178
1

Создать файл xml schema на основе корректного xml

20.02.2014, 12:42. Просмотров 1780. Ответов 5
Метки нет (Все метки)

Вообщем есть следующая задача.
Корректный XML файл results.xml содержит результаты прохождения теста студентами в виде:
xml
XML
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
<?xml version="1.0" encoding="UTF-8"?>
<results xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:noNamespaceSchemaLocation="results.xsd">
  <student>
    <login>cool</login>
    <tests>
      <test name="oop" date="2013-03-20" mark="8.5"/>
      <test name="xml" date="2013-03-23" mark="7.3"/>
      <test name="oop" date="2013-03-27" mark="9.4"/>
      <test name="jdbc" date="2013-03-27" mark="6.8"/>
      <test name="xml" date="2013-03-29" mark="7.9"/>
    </tests>
  </student>
  <student>
    <login>clever</login>
    <tests>
      <test name="oop" date="2013-03-27" mark="7.0"/>
      <test name="collections" date="2013-03-28" mark="6.4"/>
    </tests>
  </student>
</results>

Нужно:
1.Создать XSD–схему для приведённого выше XML–файла.
2.Загрузить данные из файла в коллекцию List<TestResult>. Класс TestResult должен содержать поля:
- string login;
- string test;
- DateTime date;
- int mark.
3.Вывести коллекцию на консоль построчно в формате:
login;test;date;mark
Замечания

- Строки
XML
1
2
<results   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
         xsi:noNamespaceSchemaLocation="results.xsd">
обеспечивают связь документа xml со схемой xsd, но при этом в схеме не должно вводиться целевое пространство имен. Все элементы схемы должны иметь стандартный префикс xsd.
- В классе результата для хранения оценки использовать целый тип. При выводе это поле должно отображаться с одним знаком после запятой.Нет вещественной оценки и с этим фактом надо смириться Есть шкала оценок от 0 до 100, но оценка отображается в диапазоне от 0 до 10. Следовательно, при тестировании на файле из условия должен быть результат:
cool;oop;20.04.2010;8.5
cool;xml;23.04.2010;7.3
-*В xsd–схеме нужны регулярные выражения для 1) логина (не менее трех символов, первый символ – латинская буква) и 2) оценки (от 0.0 до 10.0, ровно один десятичный знак после точки). Для даты использовать тип xsd:date, соответствующий дате в формате YYYY-MM-DD.
В данной задаче xsd–схема используется косвенно.

С xml я познакомился намедни, почитал несколько статей о том как происходит разбор xml файла, поиск узлов и т.д, о том как создавать xml программно. Но можно ли создавать программно xml-schema? Возможно generateDS или PyXB могут это? За меня решать задачу не надо, мне нужен азимут до ближайшего правильного решения, желательно пример на схожую задачу.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
20.02.2014, 12:42
Ответы с готовыми решениями:

Дозаписать файл XML
Доброго времени суток. Что то застопорился на простых вещах. Требуется...

Сохранение данных в XML-файл
Здравствуйте, помогите пожалуйста, создать файл формата xml на питоне и...

Сформировать XML файл данными из Excel
у меня есть файл ексел, сохраненный из программы 1с. мне необходимо...

Написать функции для считывания и записи данных о выбранных сущностях в файл в формате XML
Написать функции для считывания и записи данных о выбранных сущностях в файл в...

Как обновить данные в файле xml на основе другого xml?
Добрый день! Мне необходимо разработать XSLT преобразование, которое будет...

5
Zarex
54 / 54 / 16
Регистрация: 25.03.2013
Сообщений: 178
25.02.2014, 15:57  [ТС] 2
С первым пунктом задачи пока дела обстоят плохо, но здесь человек вроде дал направление, пока не понимаю что к чему (надо было в школе английский учить а не херней страдать) но буду разбираться.
А вот наваял для остальных пунктов:
код
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
# -*- coding: utf-8 -*-
# using python 2.7.3
""" Program using classes TestResult and Student to load data
from a file to a collection. At the end script output to the console
collection lines in the following format: login;test;date;mark """
 
from datetime import date as datetype
try:
    from lxml import etree
except ImportError:
    import xml.etree.ElementTree as etree
 
class TestResult:
    ''' Class describes tests.
        TestResult(name str, date str, mark str) ->
        instance(nameTest str, dateTest datetype(YYYY,MM,DD), markTest int)
    '''
    def __init__(self, name='', date='', mark=''):
        self.nameTest = name
        self.dateTest = datetype(*map(int,date.split('-')))
        self.markTest = int(float(mark)*10) 
 
    def __str__(self):
        return '{0};{1};{2}'.format(self.nameTest, self.dateTest, 
            self.markTest/10.)
 
class Student():
    """Class for Students
        Student(login str, list_tests list) -> instance(str, list)
    """
    def __init__(self, login='',list_tests=[]):
        self.loginStudent = login
        self.listTestStudent = list_tests
 
    def __str__(self):
        return '\n'.join(('%s;%s;%s;%s' % (self.login, 
            el.nameTest, el.dateTest, el.markTest/10.) \
        for el in self.listTestStudent))
 
 
def main():
    with open('results.xml') as f:
        xml_file_tree = etree.parse(f)
        root = xml_file_tree.getroot()
        list_students = list()
        for child in root:
            if child.tag == 'student':
                student_temp = Student()
                for subchild in child:
                    if subchild.tag == "login":
                        student_temp.login = subchild.text
                    if subchild.tag == 'tests':
                        for test in subchild:
                            test_temp = TestResult(test.attrib['name'], 
                                test.attrib['date'], test.attrib['mark'])
                            student_temp.listTestStudent.append(test_temp) 
                print student_temp
                list_students.append(student_temp)
 
if __name__ == '__main__':
    main()

Немного смущает количество for, может нужно было как-то по-другому?
0
pyuser
210 / 195 / 63
Регистрация: 26.05.2011
Сообщений: 363
26.02.2014, 03:28 3
Почитайте пятый пункт статьи и измените конструктор класса Student
Цитата Сообщение от Zarex Посмотреть сообщение
Немного смущает количество for, может нужно было как-то по-другому?
Вот так, например:
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
import xml.etree.ElementTree as ET
 
def parse(fname):
    with open(fname) as f:
        xml = ET.XML(f.read())
    
    for student in xml.iterfind(".//student"):
        tests = [TestResult(x.get("name"), x.get("date"), x.get("mark")) for x in student.iterfind("tests/test")]
        yield Student(student.find("login").text, tests)
 
if __name__ == '__main__':
    for student in parse('results.xml'):
        print(student)
1
Zarex
54 / 54 / 16
Регистрация: 25.03.2013
Сообщений: 178
26.02.2014, 12:20  [ТС] 4
pyuser, спасибо. Вот ведь как, вроде и смотрел про это, а когда писал всё равно ошибку допустил. А так нормально для Student:
Python
1
2
3
def __init__(self, login='',list_tests=None):
        self.loginStudent = login
        self.listTestStudent = list_tests or []
0
pyuser
210 / 195 / 63
Регистрация: 26.05.2011
Сообщений: 363
27.02.2014, 04:07 5
Я бы сделал login обязательным параметром.
Student без тестов - вполне себе нормальная ситуация, а Student без loginStudent - это что?
0
Agrik
6 / 6 / 2
Регистрация: 31.03.2013
Сообщений: 120
14.12.2014, 20:52 6
Zarex, а регуляркой для оценок и XSD файлом не поделишься? Буду благодарен!)
0
14.12.2014, 20:52
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
14.12.2014, 20:52

XML Schema
Добрый вечер. Допустим есть XML документ: &lt;?xml version=&quot;1.0&quot;...

xml schema парсинг
не могу сообразить как парсить этот файл.общий вид структуры файла &lt;?xml...

Аттрибуты в XML Schema
Народ, нужна помощь в решении следующей задачи: Есть следующие элементы...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru