Уведомления

Группа в Telegram: @pythonsu

#1 Дек. 17, 2019 10:07:49

Yuriy_V
Зарегистрирован: 2019-12-17
Сообщения: 7
Репутация: +  0  -
Профиль   Отправить e-mail  

Поиск данных в xml по атрибуту

Доброго времени суток.

Помогите разобраться, нужно из xml разметки в которой огромное количество записей найти и вытянуть <name></name>.
Есть номер id записи он приходит из вне, мне нужно с помощью этого id выдать имя которое находится по этой записи.
Написал часть кода который получает количество записей и выводит первый id, а вот в поиске не могу разобраться((

 import re
import xml.etree.ElementTree as ET
xml_str = '''<?xml version="1.0" encoding="utf-8"?>
<orders date="2019-12-16 18:34">
  <order id="95457387" state="accepted">
    <name>Пупкин Олег Пупкинович</name>
    <phone>+180660000000</phone>
  </order>
  <order id="95403040" state="closed">
    <name>Раздолбайкин Александр</name>
    <phone>+780660000000</phone>
  </order>
</orders>'''
tree = ET.ElementTree(ET.fromstring(xml_str))
root = tree.getroot()
#‭ ‬общее количество id
print('Общее количество id',len(root[0]))
#первый id
Id = root[0].attrib
print('первое id=',Id['id'])
#В xml 100500 записей,Как найти по номеру id="95403040" и присвоить
# переменной "name" содержимое <name>Раздолбайкин Александр</name>
# пытался реализовать с помощью root[0].find, но не могу разобраться((

Заранее благодарен

Офлайн

#2 Дек. 17, 2019 10:20:47

FishHook
От:
Зарегистрирован: 2011-01-08
Сообщения: 8312
Репутация: +  568  -
Профиль   Отправить e-mail  

Поиск данных в xml по атрибуту

Yuriy_V
Вам помогут XPath запросы



Офлайн

#3 Дек. 17, 2019 10:38:09

Yuriy_V
Зарегистрирован: 2019-12-17
Сообщения: 7
Репутация: +  0  -
Профиль   Отправить e-mail  

Поиск данных в xml по атрибуту

FishHook
Вам помогут XPath запросы
а можно хоть один пример на моем коде?

Офлайн

#4 Дек. 17, 2019 11:12:49

FishHook
От:
Зарегистрирован: 2011-01-08
Сообщения: 8312
Репутация: +  568  -
Профиль   Отправить e-mail  

Поиск данных в xml по атрибуту

 from lxml import etree
xml_str = '''
<orders date="2019-12-16 18:34">
  <order id="95457387" state="accepted">
    <name>Pupkin Oleg</name>
    <phone>+180660000000</phone>
  </order>
  <order id="95403040" state="closed">
    <name>Razdolbaykin Alexander</name>
    <phone>+780660000000</phone>
  </order>
</orders>'''
root = etree.fromstring(xml_str)
orders = root.xpath('/orders/order[@id="95403040"]')
print orders[0].find('name').text



Офлайн

#5 Дек. 17, 2019 11:41:45

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 10031
Репутация: +  857  -
Профиль   Отправить e-mail  

Поиск данных в xml по атрибуту

  
>>> import xml.etree.ElementTree as ET
>>> 
>>> xml_str = '''<?xml version="1.0" encoding="utf-8"?>
... <orders date="2019-12-16 18:34">
...   <order id="95457387" state="accepted">
...     <name>Пупкин Олег Пупкинович</name>
...     <phone>+180660000000</phone>
...   </order>
...   <order id="95403040" state="closed">
...     <name>Раздолбайкин Александр</name>
...     <phone>+780660000000</phone>
...   </order>
... </orders>'''
>>> 
>>> doc = ET.fromstring(xml_str)
>>> 
>>> nodes = doc.findall('.//order[@id="95403040"]/name')
>>> 
>>> out = [i.text for i in nodes]
>>> out
['Раздолбайкин Александр']
>>>



Отредактировано py.user.next (Дек. 17, 2019 11:44:30)

Офлайн

#6 Дек. 17, 2019 17:29:00

Yuriy_V
Зарегистрирован: 2019-12-17
Сообщения: 7
Репутация: +  0  -
Профиль   Отправить e-mail  

Поиск данных в xml по атрибуту

Огромное спасибо. Благодаря Вам, на этом этапе разобрался, ищет по id прекрасно и записывает в переменную эти имена.
Но когда структура xml начинает расширятся сразу возникают ошибки по синтаксису написания.Не хватает моего опыта в Python-e
Помогите разобраться на примере кода ниже, как узнать количество пунктов <item> в структуре <items> и записать их имена <name> в массив, первый найденный <item> <name>Подсигар отечественный</name> записать в переменную удалось, но остальные не ищет и всё.

 from lxml import etree
xml_str = '''<orders date="2019-12-16 18:34">
  <order id="95457387" state="accepted">
    <name>Pupkin Oleg</name>
    <phone>+180660000000</phone>
        <items>
            <item id="576389023">
                <name>Подсигар отечественный</name>
                <quantity>3</quantity>
                <currency>шт</currency>
            </item>
            <item id="576389024">
                <name>Куртка замшивая</name>
                <quantity>3</quantity>
                <currency>шт</currency>
            </item>
            <item id="576389025">
                <name>Кинокамера заграничная</name>
                <quantity>3</quantity>
                <currency>шт</currency>
            </item>            
        </items>
  </order>
  <order id="95403040" state="closed">
    <name>Razdolbaykin Alexander</name>
    <phone>+780660000000</phone>
  </order>
</orders>'''
root = etree.fromstring(xml_str)
orders = root.xpath('/orders/order[@id="95403040"]')
print(orders[0].find('name').text)
#Product[0] = 'Подсигар отечественный'
#Product[1] = 'Куртка замшивая'
#Product[2] = 'Кинокамера заграничная'

Офлайн

#7 Дек. 18, 2019 02:49:04

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 10031
Репутация: +  857  -
Профиль   Отправить e-mail  

Поиск данных в xml по атрибуту

Yuriy_V
Не хватает моего опыта в Python-e
Python тут ни при чём. Ты не знаешь XPath. Он не относится к питону и довольно простой. Его надо изучать отдельно.

  
>>> import xml.etree.ElementTree as ET
>>> 
>>> xml_str = '''<?xml version="1.0" encoding="utf-8"?>
... <orders date="2019-12-16 18:34">
...   <order id="95457387" state="accepted">
...     <name>Pupkin Oleg</name>
...     <phone>+180660000000</phone>
...         <items>
...             <item id="576389023">
...                 <name>Подсигар отечественный</name>
...                 <quantity>3</quantity>
...                 <currency>шт</currency>
...             </item>
...             <item id="576389024">
...                 <name>Куртка замшивая</name>
...                 <quantity>3</quantity>
...                 <currency>шт</currency>
...             </item>
...             <item id="576389025">
...                 <name>Кинокамера заграничная</name>
...                 <quantity>3</quantity>
...                 <currency>шт</currency>
...             </item>            
...         </items>
...   </order>
...   <order id="95403040" state="closed">
...     <name>Razdolbaykin Alexander</name>
...     <phone>+780660000000</phone>
...   </order>
... </orders>'''
>>> 
>>> doc = ET.fromstring(xml_str)
>>> 
>>> nodes = doc.findall('.//order[@id="95457387"]/items/item/name')
>>> len(nodes)
3
>>> 
>>> out = [i.text for i in nodes]
>>> out
['Подсигар отечественный', 'Куртка замшивая', 'Кинокамера заграничная']
>>>



Офлайн

#8 Дек. 18, 2019 09:37:04

Yuriy_V
Зарегистрирован: 2019-12-17
Сообщения: 7
Репутация: +  0  -
Профиль   Отправить e-mail  

Поиск данных в xml по атрибуту

Спасибо за помощь! Смог разобраться благодаря вашим подсказкам, теперь всё работает. Спасибо FishHook и py.user.next за помощь. “+” Вам в репутацию))

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version