В некоторых ситуациях для анализа документов XML можно использовать регулярные выражения, с которыми мы познакомились выше. Они не являются полноценными инструментами синтаксического анализа и не слишком надежны и точны в ситуациях, когда в документе может присутствовать произвольный текст (текст в атрибутах тегов в особенности может сбить их с толку). Однако там, где они применимы, они предоставляют наиболее простой способ. Сценарий в примере 19.9 демонстрирует, как можно реализовать анализ файла XML из примера 19.8 с применением модуля re, о котором рассказывалось в предыдущем разделе. Как и все четыре примера, которые будут представлены в этом разделе, он просматривает содержимое файла XML в поисках номеров ISBN и связанных с ними названий и сохраняет их в виде ключей и значений в словаре Python.
Пример 19.9. PP4E\Lang\Xml\rebook.py
"""
Анализ XML: регулярные выражения (ненадежное и неуниверсальное решение)
import re, pprint
text = open(‘books.xml’).read() # str, если шаблон str
pattern = ‘(?s)isbn="(.*?)".*?<title>(.*?)</title>’ # *?=минимальный
found = re.findall(pattern, text) # (?s)=mo4ke сответств. /n
mapping = {isbn: title for (isbn, title) in found} # словарь из списка pprint.pprint(mapping) # кортежей
Вызов метода re.findall в этом сценарии отыскивает все интересующие нас вложенные теги, извлекает их содержимое и возвращает список кортежей, включающих содержимое двух групп в круглых скобках. Модуль Python pprint позволяет вывести созданный словарь в удобно отформатированном виде. Этот сценарий работает, но только пока содержимое файла не отклоняется от ожидаемого формата до такой степени, что анализ пойдет по неверному пути. Кроме того, мнемоника XML, обозначающая «&» в названии первой книги, не преобразуется автоматически:
C:\…\PP4E\Lang\Xml> python rebook.py
‘Python & XML’,
‘Python Cookbook, 2nd Edition’,
‘Python in a Nutshell, 2nd Edition’,
‘Learning Python, 4th Edition’,
‘Python Pocket Reference, 4th Edition’, ‘Programming Python, 4th Edition’}
Использованная литература:
Марк Лутц — Программирование на Python, 4-е издание, II том, 2011