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

Парсинг XML файла на Питоне

05.07.2019, 13:54. Показов 13681. Ответов 20
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте всем, как написать код чтобы Питон выводил всю строку "field name". А не только то что в двойных кавычек.
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
28
29
30
<dataRecord>
        <dataClass name="RED2">           
                <field name="DOC_TYPE">02002</field>
                <field name="NAME">ALL THE BEST</field>
                <field name="DOC_TITLE">STRONGEST NETWORK</field>
                <field name="NUMBER">5-5</field>
                <field name="SERIES"/>
                <field name="ISSUE_DATE">1989-12-21</field>           
        </dataClass>
        <dataClass name="LAND"           
                <field name="ADDRESS_LINE">ALL THE BEST</field>
                <field name="CITY"> Петрова</field>
                <field name="CODE_RKA"/>
                <field name="HOME">10, кв. 1</field>
                <field name="KADN">81-001-100-747</field>
                <field name="CITY_ID"/>
                <field name="NUMBER"/>
                <field name="STREET"> ул. Иманова д. 10</field>
                <field name="CREATE_DATE">2017-12-18</field>
                <field name="LOCATION_KATO">113200000</field>          
        </dataClass>
        <dataClass name="GREEN2">           
                <field name="KZ_ZU">09</field>
                <field name="STREET_ID">12456</field>
                <field name="ENVIROMENT_ZONE"/>
                <field name="OIL_TYPE"/>
                <field name="YELD_CLASS"/>
                <field name="SQUARE">852.78</field>           
        </dataClass>
    </dataRecord>
ОН ВЫВОДИТ ТОЛЬКО ТО ЧТО В ДВОЙНЫХ КАВЫЧЕК. ВОТ ТАК.
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
    RED2
 |-->  {'name': 'DOC_TYPE'}
 |-->  {'name': 'NAME'}
 |-->  {'name': 'DOC_TITLE'}
 |-->  {'name': 'NUMBER'}
 |-->  {'name': 'SERIES'}
 |-->  {'name': 'ISSUE_DATE'}
    LAND
 |-->  {'name': 'ADDRESS_LINE'}
 |-->  {'name': 'CITY'}
 |-->  {'name': 'CODE_RKA'}
 |-->  {'name': 'HOME'}
 |-->  {'name': 'KADN'}
 |-->  {'name': 'CITY_ID'}
 |-->  {'name': 'NUMBER'}
 |-->  {'name': 'STREET'}
 |-->  {'name': 'CREATE_DATE'}
 |-->  {'name': 'LOCATION_KATO'}
    GREEN2
 |-->  {'name': 'KZ_ZU'}
 |-->  {'name': 'STREET_ID'}
 |-->  {'name': 'ENVIROMENT_ZONE'}
 |-->  {'name': 'OIL_TYPE'}
 |-->  {'name': 'YELD_CLASS'}
 |-->  {'name': 'SQUARE'}
 
Process finished with exit code 0
Код я пишу таким образом
Python
1
2
3
4
5
6
7
8
9
10
import xml.etree.ElementTree as ET
tree = ET.parse('1example.xml')
root = tree.getroot()
 
 
for dataClass in root.findall('dataClass'):
    name = dataClass.get('name')
    print(name)
    for field in root.iter('field'):
        print(' |--> ', field.attrib)
Помогите пожалуйста.
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
05.07.2019, 13:54
Ответы с готовыми решениями:

Парсинг xml файла
Нужно парсить xml-файл. Вводится начальная и конечная даты, затем вывести отсортированную(по возрастанию значения текста внутри тегов...

Парсинг xml файла
Есть файл подобного содержания. &lt;?xml version=&quot;1.0&quot; ?&gt; &lt;default:TED_EXPORT DOC_ID=&quot;587390-2020&quot; EDITION=&quot;2020238&quot;...

Парсинг xml файла
Изучаю python, пробую парсить xml Файл следующего вида &lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; ?&gt; &lt;DeviceStatus version=&quot;1.0&quot;...

20
1293 / 677 / 367
Регистрация: 07.01.2019
Сообщений: 2,302
05.07.2019, 13:59
Лучший ответ Сообщение было отмечено iSmokeJC как решение

Решение

Так что ли

Python
1
2
3
4
5
6
7
8
9
10
import xml.etree.ElementTree as ET
tree = ET.parse('file.xml')
root = tree.getroot()
 
 
for dataClass in root.findall('dataClass'):
    name = dataClass.get('name')
    print(name)
    for field in root.iter('field'):
        print(' |--> ', field.attrib, '->', field.text)
0
0 / 0 / 0
Регистрация: 02.07.2019
Сообщений: 33
05.07.2019, 14:51  [ТС]
вот я тупой спасибо tooru, все верно
0
1 / 1 / 0
Регистрация: 17.08.2015
Сообщений: 16
25.07.2019, 08:32
Помогите разобраться с парсингом и редактированием файла.
В minidom смог его распарсить, но нигде не нашел информации, как его редактировать.
Поэтому начал разбираться с ElementTree. Но никак не получается найти нужное поле.

Есть XML, в котором надо найти и проанализировать тег TotalNetCharge (строка 31). Потом найти еще несколько тегов и сравнить их. При необходимости отредактировать.

Но цикл for rec in root.iter('TotalNetCharge') не отрабатывает. Если я правильно понимаю, то не по каким-то причинам не может найти этот тег.
Как правильно написать? Я вчера уже всю голову сломал. При том что на XML другой структуры у меня все получалось находить и редактировать. Но здесь с самого начала какая-то засада. После запуска выводит только первый print('Start'). Больше ничего не выводит.

Python
1
2
3
4
5
6
7
8
import xml.etree.cElementTree as ET
 
tree = ET.parse(r'C:/Files/DRTDRLUXMACHECFUKRUM.xml')
root = tree.getroot()
print('Start')
 
for rec in root.iter('TotalNetCharge'):
    print('2')
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
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
<?xml version="1.0" encoding="UTF-8"?>
<RTDR xmlns:tadig-gen="https://infocentre.gsm.org/TADIG-GEN" xmlns="https://infocentre.gsm.org/TADIG-RTDR">
   <RTDRFileHeader>
      <Prefix>DRTDR</Prefix>
      <Sender>LUXMA</Sender>
      <Recipient>CHECF</Recipient>
      <PMN>UKRUM</PMN>
      <ReportSeqNo>03030</ReportSeqNo>
      <RTDRReferenceID>03030</RTDRReferenceID>
      <TADIGGenSchemaVersion>2.4</TADIGGenSchemaVersion>
      <RTDRSchemaVersion>3.0</RTDRSchemaVersion>
      <CreationTmstp>2019-07-13T00:08:30+02:00</CreationTmstp>
   </RTDRFileHeader>
   <ConnectionList>
      <Connection>
         <VPMN>UKRUM</VPMN>
         <HPMN>LIEK9</HPMN>
         <FileItemList>
            <FileItem>
            <FileID>14992398</FileID>
               <ExchTmstp>2019-07-12T11:12:03+02:00</ExchTmstp>
               <FileType>
                  <InitTAP>
                     <TAPSeqNo>05230</TAPSeqNo>
                     <NotifFileInd>true</NotifFileInd>
                     <ChargeInfo>
                        <TAPTxCutoffTmstp>2019-07-12T06:00:00+03:00</TAPTxCutoffTmstp>
                        <TAPAvailTmstp>2019-07-12T06:46:02+03:00</TAPAvailTmstp>
                        <TAPCurrency>XDR</TAPCurrency>
                        <TotalNoOfCalls>1</TotalNoOfCalls>
                        <TotalNetCharge>100</TotalNetCharge>
                        <TotalTax>0</TotalTax>
                        <TrafficBreakdownList>
                           <TrafficBreakdownItem>
                              <CallEventType>CS MO</CallEventType>
                              <CallEventInfo>
                                 <NumberOfEvents>2</NumberOfEvents>
                                 <TotNetCharge>200.000000</TotNetCharge>
                                 <TotTaxValue>0.000000</TotTaxValue>
                              </CallEventInfo>
                           </TrafficBreakdownItem>
                        </TrafficBreakdownList>
                     </ChargeInfo>
                  </InitTAP>
               </FileType>
            </FileItem>
            <FileItem>
0
0 / 0 / 0
Регистрация: 17.07.2019
Сообщений: 22
25.07.2019, 11:00
Парсинг XML файла на Питоне
0
1 / 1 / 0
Регистрация: 17.08.2015
Сообщений: 16
25.07.2019, 11:05
Ссылка ведет в эту же тему. Я не понял, что это означает. Можно пояснить?
Метод findall у меня тоже ничего не находит. Я пробовал.
0
1303 / 843 / 409
Регистрация: 12.03.2018
Сообщений: 2,305
25.07.2019, 12:00
Urusmab, по полному пути можно найти TotalNetCharge
Python
1
2
3
4
5
6
import xml.etree.cElementTree as ET
 
tree = ET.parse('myxml.xml')
root = tree.getroot()
 
print(root.findall('./ConnectionList/Connection/FileItemList/FileItem/FileType/InitTAP/ChargeInfo/TotalNetCharge'))
0
1 / 1 / 0
Регистрация: 17.08.2015
Сообщений: 16
25.07.2019, 12:12
Спасибо большое за помощь, но у меня вывело пустые скобки.
Может быть в пути не хватает самого первого тега
XML
1
2
<?xml version="1.0" encoding="UTF-8"?>
<RTDR xmlns:tadig-gen="https://infocentre.gsm.org/TADIG-GEN" xmlns="https://infocentre.gsm.org/TADIG-RTDR">
?

Я вписал
Python
1
print(root.findall('./RTDR/ConnectionList/Connection/FileItemList/FileItem/FileType/InitTAP/ChargeInfo/TotalNetCharge'))
Но это видимо неправильно, потому что все равно выводи пустые квадратные скобки.
Как правильно дополнить путь?
0
1303 / 843 / 409
Регистрация: 12.03.2018
Сообщений: 2,305
25.07.2019, 12:24
Пространство имен
Python
1
2
3
4
5
6
7
8
9
print(root.findall('./\
{https://infocentre.gsm.org/TADIG-RTDR}ConnectionList/\
{https://infocentre.gsm.org/TADIG-RTDR}Connection/\
{https://infocentre.gsm.org/TADIG-RTDR}FileItemList/\
{https://infocentre.gsm.org/TADIG-RTDR}FileItem/\
{https://infocentre.gsm.org/TADIG-RTDR}FileType/\
{https://infocentre.gsm.org/TADIG-RTDR}InitTAP/\
{https://infocentre.gsm.org/TADIG-RTDR}ChargeInfo/\
{https://infocentre.gsm.org/TADIG-RTDR}TotalNetCharge'))
0
1 / 1 / 0
Регистрация: 17.08.2015
Сообщений: 16
25.07.2019, 12:33
Все равно что-то не выходит каменный цветочек...
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
import xml.etree.cElementTree as ET
 
tree = ET.parse(r'C:/Files/DRTDRLUXMACHECFUKRUM.xml')
root = tree.getroot()
print('Start')
 
 
print(root.findall('\./{https://infocentre.gsm.org/TADIG-RTDR}ConnectionList/\
{https://infocentre.gsm.org/TADIG-RTDR}Connection/\
{https://infocentre.gsm.org/TADIG-RTDR}FileItemList/\
{https://infocentre.gsm.org/TADIG-RTDR}FileItem/\
{https://infocentre.gsm.org/TADIG-RTDR}FileType/\
{https://infocentre.gsm.org/TADIG-RTDR}InitTAP/\
{https://infocentre.gsm.org/TADIG-RTDR}ChargeInfo/\
{https://infocentre.gsm.org/TADIG-RTDR}TotalNetCharge'))
выводит

Python
1
2
3
4
================== RESTART: C:/Distr/Python/Scripts/rtdr.py ==================
Start
[]
>>>
Как можно вывести список тегов?
Или как можно обратиться к конкретному тегу? Чтобы увидеть его путь. Чтобы потом указать в поиске.
0
1303 / 843 / 409
Регистрация: 12.03.2018
Сообщений: 2,305
25.07.2019, 12:48
Вы внимательно посмотрите на первые символы строки (параметр для findall).
0
1 / 1 / 0
Регистрация: 17.08.2015
Сообщений: 16
25.07.2019, 13:12
Да, вижу ошибку на своей стороне. После исправления вышли параметры на печать.

После этого попробовал по аналогии найти значения для тегов, но не получилось

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
import xml.etree.cElementTree as ET
 
tree = ET.parse(r'C:/Files/DRTDRLUXMACHECFUKRUM.xml')
root = tree.getroot()
print('Start')
 
 
print(root.findall('./\
{https://infocentre.gsm.org/TADIG-RTDR}ConnectionList/\
{https://infocentre.gsm.org/TADIG-RTDR}Connection/\
{https://infocentre.gsm.org/TADIG-RTDR}FileItemList/\
{https://infocentre.gsm.org/TADIG-RTDR}FileItem/\
{https://infocentre.gsm.org/TADIG-RTDR}FileType/\
{https://infocentre.gsm.org/TADIG-RTDR}InitTAP/\
{https://infocentre.gsm.org/TADIG-RTDR}ChargeInfo/\
{https://infocentre.gsm.org/TADIG-RTDR}TotalNetCharge'))
 
for rec in root.iter('./\
{https://infocentre.gsm.org/TADIG-RTDR}ConnectionList/\
{https://infocentre.gsm.org/TADIG-RTDR}Connection/\
{https://infocentre.gsm.org/TADIG-RTDR}FileItemList/\
{https://infocentre.gsm.org/TADIG-RTDR}FileItem/\
{https://infocentre.gsm.org/TADIG-RTDR}FileType/\
{https://infocentre.gsm.org/TADIG-RTDR}InitTAP/\
{https://infocentre.gsm.org/TADIG-RTDR}ChargeInfo/\
{https://infocentre.gsm.org/TADIG-RTDR}TotalNetCharge'):
    for elem in rec:
        print(elem.text)
Что я делаю не так? Или есть какой-то другой способ получить значения и при необходимости откорректировать их?
Я предполагал, что метод inter и полный путь к тегам даст их список, чтобы потом с ними можно было работать. Но результат показывает, что я где-то ошибаюсь.
0
1303 / 843 / 409
Регистрация: 12.03.2018
Сообщений: 2,305
25.07.2019, 13:25
Python
1
2
for rec in root.iter('{https://infocentre.gsm.org/TADIG-RTDR}TotalNetCharge'):
    print(rec.text)
1
Эксперт Python
5438 / 3859 / 1215
Регистрация: 28.10.2013
Сообщений: 9,552
Записей в блоге: 1
25.07.2019, 13:51
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
try: 
    from lxml import etree
except ImportError: 
    import xml.etree.ElementTree as etree
 
import xml.etree.ElementTree as etree
nsmap = {
        'default': 'https://infocentre.gsm.org/TADIG-RTDR',
        "tadig-gen":"https://infocentre.gsm.org/TADIG-GEN"
        }
 
xml_path = "xml_test.xml"
tree = etree.parse(xml_path)
root = tree.getroot()
 
elem = root.find('.//default:TotNetCharge',nsmap)
print(elem.tag,"=",elem.text) 
 
for elem in root.iterfind('.//default:TotNetCharge',nsmap):
    print(elem.tag,"=",elem.text)   
    
for elem in root.findall('.//default:TotNetCharge',nsmap):
    print(elem.tag,"=",elem.text)
    
    
# iter ищет только по тегу, по xpath - iterfind; также не принимает параметром карту namespace
# поэтому не надо использовать этот метод, когда есть другие
for elem in root.iter("{https://infocentre.gsm.org/TADIG-RTDR}TotNetCharge"):
    print(elem.tag,"=",elem.text)
1
1 / 1 / 0
Регистрация: 17.08.2015
Сообщений: 16
25.07.2019, 14:59
Спасибо большое за помощь.
После комментариев ioprst, появился свет в конце туннеля

Garry Galler, как понять, в каких случаях надо использовать

Python
1
2
3
4
nsmap = {
        'default': 'https://infocentre.gsm.org/TADIG-RTDR',
        "tadig-gen":"https://infocentre.gsm.org/TADIG-GEN"
        }
0
1303 / 843 / 409
Регистрация: 12.03.2018
Сообщений: 2,305
25.07.2019, 15:08
Urusmab, когда используете пространство имен.
0
1 / 1 / 0
Регистрация: 17.08.2015
Сообщений: 16
25.07.2019, 16:09
Пространство имен в XML это то, что обозначено xmlns?

XML
1
... xmlns="..."
0
1303 / 843 / 409
Регистрация: 12.03.2018
Сообщений: 2,305
25.07.2019, 16:26
Цитата Сообщение от Urusmab Посмотреть сообщение
Пространство имен в XML это то, что обозначено xmlns?
да.
1
1 / 1 / 0
Регистрация: 17.08.2015
Сообщений: 16
25.07.2019, 17:29
Спасибо большое за пояснения и терпение.
0
25.07.2019, 20:13
 Комментарий модератора 
Urusmab, на будущее - не нужно задавать свой вопрос в чужой теме, создай свою. Один вопрос - одна тема.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
25.07.2019, 20:13
Помогаю со студенческими работами здесь

Парсинг xml-файла(размером в 14,6 млн строк) lxml парсером
в общем вот здесь выкладываю архивированную базу данных в xml формате google.drive вот питоновский код, все очень примитивно, если...

Парсинг XML-файла с помощью LINQ to XML
Здрасивуйте. Трабл никак не могу понять в чем дело не могу считать инфу с XML login, getWorkersOUs надо записать в textBox а все c...

Парсинг XML файла и сохранение информации из файла в структуре или массиве
Доброго времени суток. Пытаюсь распарсить XML файл и вытащить оттуда все данные, а после записать их в структуру или массив. Файл парсится...

Парсинг XML файла
Как парсить XML файлы на сайте ruby on rails, делаю сервис поиска погоды по городам, хочу парсить xml файл, с него доставать погоду в...

Парсинг XML файла
Здравствуйте, требуется распарсить данный кусок кода и вытащить значения у &lt;w:sz w:val=&quot;36&quot;/&gt; т.е. получить переменную...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Оттенки серого
Argus19 18.03.2026
Оттенки серого Нашёл в интернете 3 прекрасных модуля: Модуль класса открытия диалога открытия/ сохранения файла на Win32 API; Модуль класса быстрого перекодирования цветного изображения в оттенки. . .
SDL3 для Desktop (MinGW): Рисуем цветные прямоугольники с помощью рисовальщика SDL3 на Си и C++
8Observer8 17.03.2026
Содержание блога Финальные проекты на Си и на C++: finish-rectangles-sdl3-c. zip finish-rectangles-sdl3-cpp. zip
Символические и жёсткие ссылки в Linux.
algri14 15.03.2026
Существует два типа ссылок — символические и жёсткие. Ссылка в Linux — это запись в каталоге, которая может указывать либо на inode «файла-ИСТОЧНИКА», тогда это будет «жёсткая ссылка» (hard link),. . .
[Owen Logic] Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора
ФедосеевПавел 14.03.2026
Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора ВВЕДЕНИЕ Выполняя задание на управление насосной группой заполнения резервуара,. . .
делаю науч статью по влиянию грибов на сукцессию
anaschu 13.03.2026
прикрепляю статью
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru