fox_12
@fox_12
Расставляю биты, управляю заряженными частицами

Как получить Правильный порядок в pydantic-xml?

Пытаюсь распарсить xml следующего вида (лишние элементы выкинул чтобы получить минимально воспроизводимый кусок кода):

xml_text = '''<Periods>
    <Year>01.01.2023 0:00:00</Year>
    <Date_from>18.02.2023 0:00:00</Date_from>
    <Year>01.01.2023 0:00:00</Year>
    <Date_from>30.05.2023 0:00:00</Date_from>
    <Year>01.01.2023 0:00:00</Year>
    <Date_from>06.04.2023 0:00:00</Date_from>
    <Year>01.01.2023 0:00:00</Year>
    <Date_from>28.02.2023 0:00:00</Date_from>
    <Year>01.01.2023 0:00:00</Year>
    <Date_from>19.06.2023 0:00:00</Date_from>
    <Year>01.01.2023 0:00:00</Year>
    <Date_from>07.06.2023 0:00:00</Date_from>
</Periods>'''


с помощью кода:

import pprint
from typing import List

from pydantic_xml import BaseXmlModel, element
from pydantic_xml.element.element import SearchMode


class Periods(BaseXmlModel, tag='Periods', search_mode=SearchMode.UNORDERED):
    year: List[str] = element(tag='Year', default_factory=list)
    date_from: List[str] = element(tag='Date_from', default_factory=list)


data = Periods.from_xml(xml_text)
pprint.pprint(data.date_from)

При этом если выбран search_mode=SearchMode.UNORDERED, то результат такой:
['30.05.2023 0:00:00',
 '28.02.2023 0:00:00',
 '18.02.2023 0:00:00',
 '19.06.2023 0:00:00',
 '06.04.2023 0:00:00',
 '07.06.2023 0:00:00']

Как видно - порядок дат неверен.
Хорошо - задаем search_mode=SearchMode.ORDERED:
['07.06.2023 0:00:00']
не все даты выводятся.
Такая же история с search_mode=SearchMode.STRICT:
['18.02.2023 0:00:00']

Как таки распарсить все элементы в правильном порядке следования?
  • Вопрос задан
  • 244 просмотра
Пригласить эксперта
Ответы на вопрос 1
i229194964
@i229194964
Веб разработчик
from pydantic import BaseModel
from typing import List

class Period(BaseModel):
    year: str
    date_from: str

# Используем эту модель для парсинга каждого отдельного периода

# Используем lxml для парсинга xml
from lxml import etree

root = etree.fromstring(xml_text)
periods = []
for i in range(0, len(root), 2):
    year = root[i].text
    date_from = root[i + 1].text
    periods.append(Period(year=year, date_from=date_from))

pprint.pprint(periods)

<Periods>
    <Year>01.01.2023 0:00:00</Year>
    <Date_from>18.02.2023 0:00:00</Date_from>
    <Year>01.01.2023 0:00:00</Year>
    <Date_from>28.02.2023 0:00:00</Date_from>
    <Year>01.01.2023 0:00:00</Year>
    <Date_from>30.05.2023 0:00:00</Date_from>
    <Year>01.01.2023 0:00:00</Year>
    <Date_from>06.04.2023 0:00:00</Date_from>
    <Year>01.01.2023 0:00:00</Year>
    <Date_from>19.06.2023 0:00:00</Date_from>
    <Year>01.01.2023 0:00:00</Year>
    <Date_from>07.06.2023 0:00:00</Date_from>
</Periods>
Ответ написан
Ваш ответ на вопрос

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

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