Поиск…


замечания

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

Открытие и чтение с использованием 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

Импортировать модуль Element Tree и открыть xml-файл, получить элемент xml

import xml.etree.ElementTree as ET
tree = ET.parse('sample.xml')
root=tree.getroot()
element = root[0] #get first child of root element

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

element.set('attribute_name', 'attribute_value') #set the attribute to xml element
element.text="string_text"

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

root.remove(element)

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

tree.write('output.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)
# Output will be like this
#<parent><child1 /></parent>

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

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

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

comment = ET.Comment('user comment')
p.append(comment) #this comment will be appended to parent element

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

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

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

import xml.etree.ElementTree as ET

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

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

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

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

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

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

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

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

 <Catalog>
    <Books>
        <Book id="1" price="7.95">
            <Title>Do Androids Dream of Electric Sheep?</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']") 
# always use '' in the right side of the comparison

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

tree.find("Books/Book[@id='5']")
# searches with xml attributes must have '@' before the name

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

tree.find("Books/Book[2]")
# indexes starts at 1, not 0

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

tree.find("Books/Book[last()]")
# 'last' is the only xpath function allowed in ElementTree

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

tree.findall(".//Author")
#searches with // must use a relative path


Modified text is an extract of the original Stack Overflow Documentation
Лицензировано согласно CC BY-SA 3.0
Не связан с Stack Overflow