Задать вопрос

Как правильно распарсить xml файл в Python?

Имеется XML файл. Приведу его кусок:

<eventsList>
<event>
        <id>374648e7-0c33-403f-bec5-c580fcf9fc8b</id>
        <date>2016-03-30T21:11:33.163+03:00</date>
        <type>deletedPrintedItems</type>
        <departmentId>3</departmentId>
        <attribute>
            <name>comment</name>
            <value>sadasd</value>
        </attribute>
        <attribute>
            <name>user</name>
            <value>65d90cba-a421-4e4d-9d3e-14ddd6907280</value>
        </attribute>
        <attribute>
            <name>openTime</name>
            <value>Wed Mar 30 21:07:53 MSK 2016</value>
        </attribute>
        <attribute>
            <name>tableNum</name>
            <value>2</value>
        </attribute>
        <attribute>
            <name>session</name>
            <value>1.000000000</value>
        </attribute>
        <attribute>
            <name>orderNum</name>
            <value>4.000000000</value>
        </attribute>
        <attribute>
            <name>reason</name>
            <value>Со списанием</value>
        </attribute>
        <attribute>
            <name>receiptsSum</name>
            <value>0E-9</value>
        </attribute>
        <attribute>
            <name>dishes</name>
            <value>Салат Оливье</value>
        </attribute>
        <attribute>
            <name>isBanquet</name>
            <value>0E-9</value>
        </attribute>
        <attribute>
            <name>withWriteoff</name>
            <value>1.000000000</value>
        </attribute>
        <attribute>
            <name>penalty</name>
            <value>0E-9</value>
        </attribute>
        <attribute>
            <name>rowCount</name>
            <value>1.000000000</value>
        </attribute>
        <attribute>
            <name>numGuests</name>
            <value>4.000000000</value>
        </attribute>
        <attribute>
            <name>auth</name>
            <value>65d90cba-a421-4e4d-9d3e-14ddd6907280</value>
        </attribute>
        <attribute>
            <name>orderSumAfterDiscount</name>
            <value>0E-9</value>
        </attribute>
        <attribute>
            <name>terminal</name>
            <value>49c7d0ba-a469-517f-0153-61a7bcb29ccb</value>
        </attribute>
        <attribute>
            <name>sum</name>
            <value>70.000000000</value>
        </attribute>
        <attribute>
            <name>method</name>
            <value>Списание за счет заведения</value>
        </attribute>
        <attribute>
            <name>orderId</name>
            <value>e55c392f-ea8a-4c96-aecd-2bd0b6ffd2cd</value>
        </attribute>
        <attribute>
            <name>waiter</name>
            <value>5daf4283-ae8c-4a95-83e5-052fb4a33570</value>
        </attribute>
    </event>
    <event>
        <id>61d3cb56-74dd-4d20-86ae-217c37f15f01</id>
        <date>2016-03-30T21:11:41.090+03:00</date>
        <type>frontLogout</type>
        <departmentId>3</departmentId>
        <attribute>
            <name>user</name>
            <value>65d90cba-a421-4e4d-9d3e-14ddd6907280</value>
        </attribute>
        <attribute>
            <name>session</name>
            <value>1.000000000</value>
        </attribute>
        <attribute>
            <name>terminal</name>
            <value>49c7d0ba-a469-517f-0153-61a7bcb29ccb</value>
        </attribute>
    </event>
</eventsList>


Мне нужно найти событие deletedPrintedItems в теге type. Если оно есть, то нужно вывести также содержимое некоторых attribute (например где содержится attribute/name(comment) значени value)

Написал код на Python

from lxml import etree
tree = etree.parse('xml_iiko.xml')
nodes = tree.xpath('/eventsList/event/type')
for node in nodes:
    if node.text == 'deletedPrintedItems':


но дальше не знаю как реализовать все что нужно. Кто может натолкнуть или показать в документации куда двигаться?
  • Вопрос задан
  • 1123 просмотра
Подписаться 4 Оценить Комментировать
Решения вопроса 1
@abcd0x00
Выбирает нужные события в документе.
В нужных событиях выбирает нужные атрибуты.
В нужных атрибутах выбирает нужный элемент.

Код
>>> import lxml.etree
>>> 
>>> text = """\
... <eventsList>
... <event>
...         <id>374648e7-0c33-403f-bec5-c580fcf9fc8b</id>
...         <date>2016-03-30T21:11:33.163+03:00</date>
...         <type>deletedPrintedItems</type>
...         <departmentId>3</departmentId>
...         <attribute>
...             <name>comment</name>
...             <value>sadasd</value>
...         </attribute>
...         <attribute>
...             <name>user</name>
...             <value>65d90cba-a421-4e4d-9d3e-14ddd6907280</value>
...         </attribute>
...         <attribute>
...             <name>openTime</name>
...             <value>Wed Mar 30 21:07:53 MSK 2016</value>
...         </attribute>
...         <attribute>
...             <name>tableNum</name>
...             <value>2</value>
...         </attribute>
...         <attribute>
...             <name>session</name>
...             <value>1.000000000</value>
...         </attribute>
...         <attribute>
...             <name>orderNum</name>
...             <value>4.000000000</value>
...         </attribute>
...         <attribute>
...             <name>reason</name>
...             <value>Со списанием</value>
...         </attribute>
...         <attribute>
...             <name>receiptsSum</name>
...             <value>0E-9</value>
...         </attribute>
...         <attribute>
...             <name>dishes</name>
...             <value>Салат Оливье</value>
...         </attribute>
...         <attribute>
...             <name>isBanquet</name>
...             <value>0E-9</value>
...         </attribute>
...         <attribute>
...             <name>withWriteoff</name>
...             <value>1.000000000</value>
...         </attribute>
...         <attribute>
...             <name>penalty</name>
...             <value>0E-9</value>
...         </attribute>
...         <attribute>
...             <name>rowCount</name>
...             <value>1.000000000</value>
...         </attribute>
...         <attribute>
...             <name>numGuests</name>
...             <value>4.000000000</value>
...         </attribute>
...         <attribute>
...             <name>auth</name>
...             <value>65d90cba-a421-4e4d-9d3e-14ddd6907280</value>
...         </attribute>
...         <attribute>
...             <name>orderSumAfterDiscount</name>
...             <value>0E-9</value>
...         </attribute>
...         <attribute>
...             <name>terminal</name>
...             <value>49c7d0ba-a469-517f-0153-61a7bcb29ccb</value>
...         </attribute>
...         <attribute>
...             <name>sum</name>
...             <value>70.000000000</value>
...         </attribute>
...         <attribute>
...             <name>method</name>
...             <value>Списание за счет заведения</value>
...         </attribute>
...         <attribute>
...             <name>orderId</name>
...             <value>e55c392f-ea8a-4c96-aecd-2bd0b6ffd2cd</value>
...         </attribute>
...         <attribute>
...             <name>waiter</name>
...             <value>5daf4283-ae8c-4a95-83e5-052fb4a33570</value>
...         </attribute>
...     </event>
...     <event>
...         <id>61d3cb56-74dd-4d20-86ae-217c37f15f01</id>
...         <date>2016-03-30T21:11:41.090+03:00</date>
...         <type>frontLogout</type>
...         <departmentId>3</departmentId>
...         <attribute>
...             <name>user</name>
...             <value>65d90cba-a421-4e4d-9d3e-14ddd6907280</value>
...         </attribute>
...         <attribute>
...             <name>session</name>
...             <value>1.000000000</value>
...         </attribute>
...         <attribute>
...             <name>terminal</name>
...             <value>49c7d0ba-a469-517f-0153-61a7bcb29ccb</value>
...         </attribute>
...     </event>
... </eventsList>
... """
>>> 
>>> doc = lxml.etree.fromstring(text)
>>> events = doc.xpath(r'//event/type[text() = "deletedPrintedItems"]/..')
>>> 
>>> for event in events:
...     comments = event.xpath(r'.//attribute/name[text() = "comment"]'
...                            r'/../value/text()')
...     print(comments)
... 
['sadasd']
>>>

Ответ написан
Пригласить эксперта
Ответы на вопрос 1
@iegor
Проитерируйтесь по event, в каждом найдите type, если устраивает, в этом event извлеките нужный attribute.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы