Шаг 106.
Python: сборник рецептов.
Кодирование и обработка данных. Парсинг, изменение и перезапись XML

    На этом шаге мы рассмотрим реализацию этой задачи.

Задача

    Вы хотите прочесть XML-документ, изменить его, а затем записать обратно в форме XML.

Решение

    Модуль xml.etree.ElementTree облегчает выполнение таких задач. Вы можете начать с парсинга документа обычным способом. Предположим, например, что у вас есть документ под названием pred.xml, который выглядит так:

<?xml version="1.0"?>
<stop>
  <id>14791</id>
  <nm>Clark & Balmoral</nm>
  <sri>
    <rt>22</rt>
    <d>North Bound</d>
    <dd>North Bound</dd>
  </sri>
  <cr>22</cr>
  <pre>
    <pt>5 MIN</pt>
    <fd>Howard</fd>
    <v>1378</v>
    <rn>22</rn>
  </pre>
  <pre>
    <pt>15 MIN</pt>
    <fd>Howard</fd>
    <v>1867</v>
    <rn>22</rn>
  </pre> 
</stop>

    Вот пример того, как можно использовать ElementTree для прочтения документа и изменения его структуры:

>>> from xml.etree.ElementTree import parse, Element
>>> doc = parse('pred.xml')
>>> root = doc.getroot()
>>> root
<Element 'stop' at 0x0000018173A81040>
>>> # Удалим несколько элементов
>>> root.remove(root.find('sri'))
>>> root.remove(root.find('cr'))
>>> # Вставка нового элемента после <nm>...</nm>
>>> root.getchildren().index(root.find('nm'))
1
>>> e = Element('spam')
>>> e.text = 'This is a test'
>>> root.insert(2, e)
>>> # Запись обратно в файл
>>> doc.write('newpred.xml', xml_declaration=True)
>>>

    Результатом этих операций будет новый XML-файл, который выглядит так:

<?xml version='1.0' encoding='us-ascii'?>
<stop>
  <id>14791</id>
  <nm>Clark & Balmoral</nm>
  <spam>This is a test</spam>
  <pre>
    <pt>5 MIN</pt>
    <fd>Howard</fd>
    <v>1378</v>
    <rn>22</rn>
  </pre>
  <pre>
    <pt>15 MIN</pt>
    <fd>Howard</fd>
    <v>1867</v>
    <rn>22</rn>
  </pre> 
</stop>


Обсуждение

    Изменение структуры XML-документа - незамысловатый процесс, но вы должны помнить, что все изменения в общем применяются к родительскому элементу, и они обращаются с ним как со списком. Например, если вы уберете элемент, он будет убран из его непосредственного родителя путем использования метода remove() родителя. Если вы вставляете или добавляете новые элементы в конец, вы также применяете методы insert() и append() к родителю. Еще можно манипулировать элементами с помощью операций индексирования и извлечения среза, таких как element[i] или element[j:j].

    Если вы хотите создать новые элементы, используйте класс Element, как показано в этом рецепте. Это также описано на предыдущем шаге.

    На следующем шаге мы рассмотрим парсинг XML-документов с пространствами имен.




Предыдущий шаг Содержание Следующий шаг