Създаване, редактиране и анализиране на XML файл
Python съдържа вграден XML инструменти за синтактичен анализ, до който имате достъп чрез модула xml. В тази статия ще разгледаме два xml подмодула:
Ще започнем с минидом поради причината, че той де факто се използва като метод за синтактичен анализ на XML. След това ще разгледаме как да използваме ElementTree за тези цели.
Работа с минидом
Първо, имаме нужда от XML, за да анализираме. Нека да разгледаме следния малък XML пример:
Това е типично XML и се чете съвсем интуитивно. В бъдеще най-вероятно ще попаднете на по-сложен пример XML, така че в нашия случай работим с много удобен материал. Както и да е, запазете горния XML под следното име: appt.xml
Нека отделим повече време, за да научим повече за синтактичния анализ на този файл в Python с помощта на модула minidom. Това е доста дълъг парче код, така че бъдете подготвени:
Този код се базира на пример от Документация за Python и заслужава да се отбележи, че е малко грозно според мен. Нека го разглобяваме парче по парче. Параметърът на url, който виждаме в класа ApptParser, може да бъде както url, така и файл. В метод getXml, използваме манипулатор на изключения, за да се опитаме да отворим URL адреса. Ако това доведе до грешка, тогава url е пътят към файла. След това използваме метода на синтактичния анализ, за да анализираме XML. След това премахваме възела от XML. Ще пропуснем всички условия, тъй като това не е от съществено значение в тази статия. Накрая връщаме обект на възел. Технически възелът е XML обект и го предаваме на метода handleXml. За да получим всички задания в XML, правим следното:
След това предаваме тази информация на метода handleAppts. Това е много информация. Добре е да имате малка рефакторинг на този код за тази цел, вместо да предаваме цялата тази информация изцяло, по този начин ние просто настройваме променливите на класа и след това извикваме следващия метод без никакви аргументи. Ще оставя това като упражнение за читателите. Във всеки случай методът handleAppts просто създава цикъл при всяко задание и извиква метода handleAppt, за да извлече допълнителна информация, добавя данните към списък и добавя този списък към друг списък. Идеята е да завършите със списък със списъци, които съдържат всички съответни данни за събранията.
Имайте предвид, че методът handleAppt извиква getElement, което от своя страна извиква метода getText. Технически можете да пропуснете повикването getElement и да се обадите директно на getText. От друга страна, може да се наложи да добавите допълнителна обработка, за да getElement за конвертиране на текст или нещо друго, преди да се върнете. Например може да се наложи да конвертирате цели числа, числа със запетаи или десетични обекти. Нека опитаме друг пример за минидом преди да продължим напред. Използваме примерен XML от сайта MSDN Microsoft: http://msdn.microsoft.com/en-us/library/ms762271%28VS.85%29.aspx. Запазете следния код като example.xml
В този пример ние анализирахме XML, извлечихме заглавията на книгите и ги изхвърлихме в stdout. Нека да разгледаме кода:
Този код е само една кратка функция, която приема един аргумент, който е XML файл. Внасяме модула minidom и му даваме същото име, за да улесним препращането към него. След това изпълняваме анализиране на XML. Първите два реда на функцията са много подобни на тези в предишния пример. Използваме метода getElementsByTagName да съберем парчетата XML, от които се нуждаем, и след това да прегледаме резултата и да извлечем заглавията на книгите. И така, ние извличаме заглавни обекти, така че трябва да прегледаме тези данни, включително и също да извадим обикновения текст, поради което използваме вложени циклични данни. Нека отделим малко време за наследство xml модул озаглавен ElementTree.