Python Language
Манипулирование XML
Поиск…
замечания
Не все элементы 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