Найти - Пользователи
Полная версия: Поиск данных в xml по атрибуту
Начало » Python для новичков » Поиск данных в xml по атрибуту
1
Yuriy_V
Доброго времени суток.

Помогите разобраться, нужно из 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, но не могу разобраться((

Заранее благодарен
FishHook
Yuriy_V
Вам помогут XPath запросы
Yuriy_V
FishHook
Вам помогут XPath запросы
а можно хоть один пример на моем коде?
FishHook
 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
py.user.next
  
>>> 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
['Раздолбайкин Александр']
>>>
Yuriy_V
Огромное спасибо. Благодаря Вам, на этом этапе разобрался, ищет по 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] = 'Кинокамера заграничная'
py.user.next
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
['Подсигар отечественный', 'Куртка замшивая', 'Кинокамера заграничная']
>>>
Yuriy_V
Спасибо за помощь! Смог разобраться благодаря вашим подсказкам, теперь всё работает. Спасибо FishHook и py.user.next за помощь. “+” Вам в репутацию))
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB