Введение
Не все элементы входных данных 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")
# поиск с // должен использовать родственный путь