На этом шаге мы рассмотрим реализацию этой задачи.
Вы хотите прочесть 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-документов с пространствами имен.