Документация по Python

Работа с XML из Python

Работа с XML из Python
В: Документация по Python

Введение

Не все элементы входных данных XML будут в конечном итоге являться элементами анализируемого дерева. В настоящий момент этот модуль пропускает все комментарии XML, инструкции по обработке и объявления типа документа во входных данных. Тем не менее, деревья, построенные с использованием API этого модуля, а не синтаксического анализа из XML-текста, могут иметь комментарии и инструкции по обработке в них.

Создание и сборка XML-документов

Импорт модуля Элемента Дерева

import xml.etree.ElementTree as ET

Функция Element () используется для создания элементов XML

p=ET.Element('parent')

Функция SubElement (), используемая для создания вложенных элементов в элементе give

c = ET.SubElement(p, 'child1')
 

Функция dump() используется для вывода элементов xml.

ET.dump(p)

# <parent><child1 /></parent>

Если вы хотите сохранить в файл, создайте дерево XML с функцией ElementTree() и сохраните в файл, используя метод write()

tree = ET.ElementTree(p)
tree.write("sample.xml")

Функция Comment() используется для вставки комментариев в XML-файл.

comment = ET.Comment('user comment')
p.append(comment) #этот комментарий будет добавлен к родительскому элементу

ET.dump(p)

# <parent><child1 /><!--user comment--></parent>

Изменение файла XML

Импортируйте модуль ElementTree и откройте файл XML, получите элемент XML

import xml.etree.ElementTree as ET
tree = ET.parse('sample.xml')
root=tree.getroot()
element = root[0] #получите первого ребенка родительского корня
element

# <Element 'child1' at 0x7fa5806a8b90>

Элементом объекта  можно управлять, изменяя его поля, добавляя и изменяя атрибуты, добавляя и удаляя дочерние элементы

element.set('attribute_name', 'attribute_value') #установите артрибут xml элементу
element.text="string_text"

Если вы хотите удалить элемент, используйте метод Element.remove()

root.remove(element)

Метод ElementTree.write(), используемый для вывода объекта XML в файлы XML.

tree.write('sample.xml')

Открытие и чтение больших файлов XML с помощью iterparse (инкрементальный анализ)

Иногда мы не хотим загружать весь XML-файл, чтобы получить необходимую нам информацию. В этих случаях полезно постепенно загружать соответствующие разделы и затем удалять их, когда мы закончим. С помощью функции iterparse вы можете редактировать дерево элементов, которое хранится при разборе XML.

Импортируйте объект ElementTree:

 import xml.etree.ElementTree as ET

 

Откройте файл .xml и переберите все элементы:

for event, elem in ET.iterparse("yourXMLfile.xml"):

#    ...  сделайте что-нибудь ...

Кроме того, мы можем искать только определенные события, такие как начальный / конечный теги или пространства имен. Если эта опция не указана (как указано выше), возвращаются только события «end»:

events=("start", "end", "start-ns", "end-ns")
for event, elem in ET.iterparse("yourXMLfile.xml", events=events):

#   ... сделайте что-нибудь ...

 

Вот полный пример, показывающий, как очистить элементы из дерева в памяти, когда мы закончим с ними:

for event, elem in ET.iterparse("yourXMLfile.xml", events=("start","end")):        
    if elem.tag == "record_tag" and event == "end":
        print elem.text
        elem.clear()

#    ... сделайтe что-нибудь другое ...

Открытие и чтение с помощью ElementTree

Импортируйте объект ElementTree, откройте соответствующий XML-файл и получите корневой тег:

import xml.etree.ElementTree as ET
tree = ET.parse("yourXMLfile.xml")
root = tree.getroot()

Есть несколько способов поиска по дереву. Сначала по итерации:

for child in root:
	print(child.tag, child.attrib)

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

print(root[0][1].text)

Для поиска конкретных тегов по имени, используйте .find или .findall:

print(root.findall("myTag"))
print(root[0].find("myOtherTag")) 

Поиск в XML с помощью XPath

Начиная с версии 2.7 ElementTree имеет лучшую поддержку XPath запросов. XPath - это синтаксис, позволяющий вам перемещаться по XML, как SQL используется для поиска в базе данных. Как find и findall функции поддержки XPath. Xml ниже будет использоваться для этого примера

<Catalog>
    <Books>
        <Book id="1" price="7.95">
            <Title>Мечтают ли андроиды об электроовцах?</Title>
            <Author>Philip K. Dick</Author>
        </Book>
        <Book id="5" price="5.95">
            <Title>The Colour of Magic</Title>
            <Author>Terry Pratchett</Author>
        </Book>
        <Book id="7" price="6.95">
            <Title>The Eye of The World</Title>
            <Author>Robert Jordan</Author>
        </Book>
    </Books>
</Catalog>

 

Поиск всех книг:

import xml.etree.cElementTree as ET
tree = ET.parse('sample.xml')
tree.findall('Books/Book')

 

Поиск книги с названием «Цвет магии»:

tree.find("Books/Book[Title='The Colour of Magic']") 
# всегда используйте '' в правой стороне сравнения

Поиск книги с id = 5:

tree.find("Books/Book[@id='5']")
# поиск с xml атрибутами должен иметь '@' перед именем
 

Поиск второй книги:

tree.find("Books/Book[2]")
# индексы начинаются с 1, не с 0

Поиск последней книги:

tree.find("Books/Book[last()]")
# 'last' единственная xpath функция позволенная в ElementTree

Поиск всех авторов:

tree.findall(".//Author")
# поиск с // должен использовать родственный путь
Еще от кодкамп
Замечательно! Вы успешно подписались.
Добро пожаловать обратно! Вы успешно вошли
Вы успешно подписались на кодкамп.
Срок действия вашей ссылки истек.
Ура! Проверьте свою электронную почту на наличие волшебной ссылки для входа.
Успех! Ваша платежная информация обновлена.
Ваша платежная информация не была обновлена.