Распарсить строку в XML на Python

Есть XML такого вида

<offer>
       <param name="Размер">36, 37, 38,42</param>
</offer>
<offer>
       <param name="Размер">36, 42</param>
</offer>

Нужно привести к такому виду

<offer>
       <param name="Размер">36</param>
       <param name="Размер">37</param>
       <param name="Размер">38</param>
       <param name="Размер">42</param>
</offer>
<offer>
       <param name="Размер">36</param>
       <param name="Размер">42</param>
</offer>

Я пытался вначале сделать с помощью Lxml.etree, потом пробовал с помощью регулярки, так ничего и не получилось.

Подскажите примером кода или дайте ссылку где почитать (может литературу).

Стоит ли вообще привязываться к XML или работать как с обычным текстовым файлом?


Ответы (1 шт):

Автор решения: Alexander Chernin

Для примера взял стандартный парсер xml.etree.ElementTree

Xml может выглядеть как угодно, но для простоты пусть будет такая структура:

xml = '''<?xml version="1.0"?>
      <data>
        <offer>
          <param name="Размер">36, 37, 38,42</param>
        </offer>
        <offer>
          <param name="Размер">36, 42</param>
        </offer>
      </data>'''
# импорт либы с синонимом
import xml.etree.ElementTree as ET   

root = ET.fromstring(xml)

# Найдем все offer на любой глубине
for offer in root.findall('.//offer'):
    # Получаем значение и разбиваем его в массив
    values = offer.find('param').text.split(',')
    # Очистка родителя
    offer.clear()

    for v in values:
        # Создаем новый дочерний узел
        param = ET.SubElement(offer, 'param')
        # Добавляем ему атрибут
        param.set('name', 'Размер')
        # Устанавливаем значение
        param.text = v.strip() # убираем лишние пробелы справа и слева от значения

# Вывод результата в консоль
ET.dump(offer)
→ Ссылка