Форум программистов, компьютерный форум, киберфорум
Python для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.64/11: Рейтинг темы: голосов - 11, средняя оценка - 4.64
0 / 0 / 0
Регистрация: 11.11.2016
Сообщений: 18

Обработка данных XML-файла

10.07.2017, 16:08. Показов 2066. Ответов 1
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый день!
В очередной раз застряла на ерундовом вопросе, надеюсь, что смогу получить у Вас совет.

Имеется XML - файл, в котором по множеству раз повторяются значения элементов. В качестве примера приведу кусочек xml, где повторяются значения <Person> - 'Mr.Smith' и 'Ms.Black':

XML
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
<DataSet>
    <Property>
        <Person>Mr.Smith</Person>
        <property>Apartment</property>
        <cost_estimate>5000000</cost_estimate>
    </Property>
    <Property>
        <Person>Mr.Smith</Person>
        <property>House</property>
        <cost_estimate>25000000</cost_estimate>
    </Property>
    <Property>
        <Person>Mr.Smith</Person>
        <property>Car</property>
        <cost_estimate>500000</cost_estimate>
    </Property>
    <Property>
        <Person>Ms.Black</Person>
        <property>Apartment</property>
        <cost_estimate>10000000</cost_estimate>
    </Property>
    <Property>
        <Person>Ms.Black</Person>
        <property>Horse</property>
        <cost_estimate>50000</cost_estimate>
    </Property>
</DataSet>
Я хочу обработать полученные данные и, например, вычислить среднее значение <cost_estimate> для каждого персонажа. Правильно ли я предполагаю, что удобнее всего для этого свести данные к виду, представленному ниже?

XML
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<DataSet>
    <Property>
        <Person>Mr.Smith</Person>
        <property1>Apartment</property1>
        <cost_estimate1>5000000</cost_estimate1>
        <property2>House</property2>
        <cost_estimate2>25000000</cost_estimate2>
        <property3>Car</property3>
        <cost_estimate3>500000</cost_estimate3>
    </Property>
    <Property>
        <Person>Ms.Black</Person>
        <property1>Apartment</property1>
        <cost_estimate1>10000000</cost_estimate1>
        <property2>Horse</property2>
        <cost_estimate2>50000</cost_estimate2>
    </Property>
</DataSet>
Если правильно, то как этого достичь? Я попыталась использовать для этой цели вложенные циклы, запись имени персонажа в список и проверку наличия имени в списке, однако в результате получаю ошибку.

Попытка реализации задачи:
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
import elementtree.ElementTree as ET
from xml.dom import minidom
 
def save_xml(filename, xml_code):
    xml_string = ET.tostring(xml_code).decode()
    xml_prettyxml = minidom.parseString(xml_string).toprettyxml()
    with open(filename, 'w') as xml_file:
        xml_file.write(xml_prettyxml)
 
tree = ET.parse('D:/xml/question.xml')
root = tree.getroot()
 
new = ET.Element('DataSet_property')
 
i = 0
list = []
 
while i < len(root):
    info = root[i]
    person = info.find('Person').text
    property = info.find('property').text
    cost = float(info.find('cost_estimate').text)
    if (person in list) == False:
        list.append(person)
        person_data = ET.SubElement(new, 'Person')
        person_name = ET.SubElement(person_data, 'Name')
        all_property = ET.SubElement(person_data, 'property %s' % i)
        money = ET.SubElement(person_data, 'cost_estimate %s' % i)
    else:
        existed = new.getchildren()
        finding = existed[(list.index(person))]
        all_property_f = ET.SubElement(finding, 'property %s' % i)
        money_f = ET.SubElement(finding, 'cost_estimate %s' % i)
    i += 1
 
save_xml('D:/xml/new_test.xml', new)
Результат:
Traceback (most recent call last):
File "D:/xml/question.py", line 36, in <module>
save_xml('D:/xml/new_test.xml', new)
File "D:/xml/question.py", line 6, in save_xml
xml_prettyxml = minidom.parseString(xml_string).topretty xml()
File "C:\Python27\lib\xml\dom\minidom.py" , line 1928, in parseString
return expatbuilder.parseString(string)
File "C:\Python27\lib\xml\dom\expatbuilder.py ", line 940, in parseString
return builder.parseString(string)
File "C:\Python27\lib\xml\dom\expatbuilder.py ", line 223, in parseString
parser.Parse(string, True)
xml.parsers.expat.ExpatError: not well-formed (invalid token): line 1, column 44

Как правильнее работать с данными xml? Имеет ли смысл, например, для вычисления среднего значения объединять все данные в новом файле по выбранному критерию или работать сразу с тем, что есть? Какие пути решения ещё возможны? Мне кажется, что я самостоятельно усложняю себе задачу..

Заранее благодарю за ответ!
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
10.07.2017, 16:08
Ответы с готовыми решениями:

Импорт данных из большого файла XML в DBF
доброго времени суток! требуется перегнать XML файл в dbf, сложность в том, что XML довольно большой и целиком его обрабатывать...

Разделение разбора xml-файла и обработка полученных данных на независимые потоки
файл разбирается при помощи StAX. разобранные данные записываются в ArrayList. для их обработки они вытаскиваются из этого же ArrayList....

Загрузка данных из XML файла в ClientDataSet (xml как база данных)
Написал обработчик xml по примерам из инета, суть состоит в том чтобы считать по заданному тегу все его дочерние теги и значения в них...

1
Эксперт Python
5438 / 3859 / 1215
Регистрация: 28.10.2013
Сообщений: 9,552
Записей в блоге: 1
10.07.2017, 18:33
Цитата Сообщение от orantig Посмотреть сообщение
вычислить среднее значение <cost_estimate> для каждого персонажа.
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#from lxml import etree # тоже работает
import xml.etree.ElementTree as etree
 
from collections import defaultdict
 
tree = etree.parse(r'dataset.xml')
 
_persons = tree.findall('.//Property')
persons = defaultdict(list)
 
for person in _persons:
    persons[person.find('Person').text].append(
            int(person.find('cost_estimate').text)
            )
 
for k,v in persons.items():
    print(k,'=',sum(v)/len(v))
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
10.07.2017, 18:33
Помогаю со студенческими работами здесь

Загрузка данных из XML файла в ClientDataSet (xml как база данных)
Написал обработчик xml по примерам из инета, суть состоит в том чтобы считать по заданному тегу все его дочерние теги и значения в них...

Обработка xml файла
Нужно добавить столбик цена в $. StringGrid1.Cells:='¹'; StringGrid1.Cells:='№'; StringGrid1.Cells:='Автор'; ...

Обработка xml файла
Здравствуйте, подскажите пожалуйста как же обработать файл в котором много массивов пример: &lt;test1&gt; &lt;te2t&gt; ...

Обработка xml файла
Как вывести в таблицу только пенсионеров? Составить и вывести на экран список работников (фамилия, имя, отчество, ИНН) пенсионного...

Обработка подгружаемого xml файла
Вот файл http://weather.yandex.ru/static/cities.xml Пытаюсь подгрузить его $xml =...


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

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
Новые блоги и статьи
Очистка реквизитов документа при копировании
Maks 09.04.2026
Алгоритм из решения ниже применим как для типовых, так и для нетиповых документов на самых различных конфигурациях. Задача: при копировании документа очищать определенные реквизиты и табличную. . .
модель ЗдравоСохранения 8. Подготовка к разному выполнению заданий
anaschu 08.04.2026
https:/ / github. com/ shumilovas/ med2. git main ветка * содержимое блока дэлэй из старой модели теперь внутри зайца новой модели 8ATzM_2aurI
Блокировка документа от изменений, если он открыт у другого пользователя
Maks 08.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа, разработанного в конфигурации КА2. Задача: запретить редактирование документа, если он открыт у другого пользователя. / / . . .
Система безопасности+живучести для сервера-слоя интернета (сети). Двойная привязка.
Hrethgir 08.04.2026
Далее были размышления о системе безопасности. Сообщения с наклонным текстом - мои. А как нам будет можно проверить, что ссылка наша, а не подделана хулиганами, которая выбросит на другую ветку и. . .
Модель ЗдрввоСохранения 7: больше работников, больше ресурсов.
anaschu 08.04.2026
работников и заданий может быть сколько угодно, но настроено всё так, что используется пока что только 20% kYBz3eJf3jQ
Дальние перспективы сервера - слоя сети с космологическим дизайном интефейса карты и логики.
Hrethgir 07.04.2026
Дальнейшее ближайшее планирование вывело к размышлениям над дальними перспективами. И вот тут может быть даже будут нужны оценки специалистов, так как в дальних перспективах всё может очень сильно. . .
Горе от ума
kumehtar 07.04.2026
Эта мне ментальная установка, что вот прямо сейчас, мол, мне для полного счастья не хватает (нужное вписать), и когда я этого достигну - тогда и полный кайф. Одна из самых сильных ловушек на пути. . . .
Использование значений реквизитов справочника в документе, с определенными условиями и правами
Maks 07.04.2026
1. Контроль срока действия договора Алгоритм из решения ниже реализован на примере нетипового документа "ЗаявкаНаРаботу", разработанного в конфигурации КА2. Задача: уведомлять пользователя, если. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru