Perl & XML. Библиотека программиста - Web - Shelek
Perl и XML


Язык программирования Perl появился достаточно давно и изначально был ориентирован на обработку текста. В отличие от Perl, за «плечами» XML — всего лишь считанные годы, но за это время он успел зарекомендовать себя с самой лучшей стороны. Этот язык широко применяется для обработки web-содержимого, выполнения различных операций с документами, проектирования web-служб, а также в любой другой ситуации, в которой требуется структурирование изменчивой информации. Несмотря на столь различную природу, эти языки прекрасно уживаются вместе. И именно описанию истории их порой сложного, но удачного союза посвящена эта книга.


В чем причина тесного союза между Perl и XML?


В первую очередь следует отметить, что Perl идеально подходит для обработки текста. Он поддерживает дескрипторы файлов, объекты документов, выполняет обработку строк, а также предлагает возможности по созданию регулярных выражений. Любой, кому приходилось изначально разрабатывать программы на низкоуровневом языке, таком как C, а потом — на Perl, понимает, что Perl гораздо лучше приспособлен для обработки текста. А XML, по существу, — это обычный текст, поэтому Perl и XML прекрасно дополняют друг друга.


Более того, начиная с версии 5.6, Perl допускает работу с символьными кодировками, основанными на Unicode (например, UTF-8), и именно этот факт чрезвычайно важен при обработке XML-документов. Дополнительные сведения о символьных кодировках можно найти в главе 3.


Во-вторых, следует так же учитывать наличие всеобъемлющей архивной сети Perl (CPAN), включающей множество Perl-модулей, доступных всем желающим. Благодаря этому задачи программиста значительно упрощаются; каждый, начинающий программировать на языке Perl, может просто воспользоваться готовыми модулями. Благодаря этому достигается значительная экономия времени и средств. Например, зачем создавать собственный анализатор кода (parser), если в сети CPAN содержится множество готовых анализаторов, доступных для свободной загрузки? Причем, как правило, все модули заранее протестированы и могут подстраиваться под конкретные нужды. Сеть CPAN не относится к числу жестко заданных структур: в ее развитие вносит вклад множество людей, а всякие проявления контроля имеют ограниченный характер. Как только возникает новая технология, в сети CPAN появляется поддерживающий ее модуль. Благодаря этому свойству прекрасно дополняются возможности XML, в результате чего могут изменяться старые и добавляться новые вспомогательные технологии.


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


В-третьих, гибкие возможности Perl, обеспечивающие объектно-ориентированное программирование, являются весьма полезными при работе с XML. Данные в XML-документе имеют иерархическую структуру, образованную с помощью базовых единиц. Эти единицы называются XML-элементами и могут содержать вложенные элементы. В результате элементы, образующие документ, могут быть представлены с помощью одного класса объектов, включающего простые идентичные интерфейсы. Более того, язык разметки XML инкапсулирует содержимое этих объектов , которые, в свою очередь, инкапсулируют код и данные. В результате они прекрасно дополняют друг друга. Нетрудно заметить, что подобные объекты весьма полезны при организации модульной структуры XML-процессоров. Они включают анализаторы, фабрики анализаторов, вспомогательные объекты, а также анализаторы, возвращающие объекты. Все это обеспечивает создание «прозрачного» кода, который может выполняться практически на всех платформах.


В-четвертых, большое значение имеет связь между Perl и Web. Конечно, Java и JavaScript обладают поистине неисчерпаемыми возможностями в этой области, но любой, кто немного разбирается в web-программировании, скажет вам, что Perl применяется при организации серверной части большинства web-серверов. Многие web-библиотеки, написанные на языке Perl, могут легко адаптироваться с учетом их применения в XML. Опытные программисты, которые годами разрабатывали web-узлы на языке Perl, могут свободно стать поддаными «королевства» XML.


И наконец, при выборе языка программирования следует исходить из личных мотивов. Язык Perl идеален при работе с XML-кодом, но не следует замыкаться исключительно на нем. Просто попробуйте поработать с ним.



XML проще, чем вы думаете


Многие люди склонны рассматривать XML как результат вмешательства некоего «злого гения», который, как минимум, собирается уничтожить все человечество. Внедренный язык разметки, с его угловыми скобками и слэшами, на первый взгляд кажется довольно сложным. К тому же, если учитывать наличие вложенных элементов, типов узлов и объявлений DTD, ситуация значительно осложняется.


А теперь авторы книги хотят поделиться с читателем маленьким секретом: создание программ, предназначенных для обработки XML-кода, не составляет особого труда. Существует целый спектр инструментальных средств, ориентированных на выполнение синтаксического анализа и построения структур данных. Причем в распоряжение пользователя предоставляются удобные в применении API, овладеть которыми возможно в течение нескольких минут. Если вы хотите испытать всю прелесть по-настоящему сложных XML-приложений, особых препятствий для этого нет, но все же не следует чрезмерно все усложнять. Сложность XML-кода варьируется в очень широких пределах, и в случае разработки простого XML-приложения следует пользоваться простыми инструментальными средствами.


Для иллюстрации справедливости этого утверждения рассмотрим простой базовый модуль, именуемый XML::Simple, созданный Грантом Мак Клином (Grant McLean). При минимальных трудозатратах со стороны пользователя обеспечивается доступ к солидному набору полезных свойств, обеспечивающих обработку XML-кода.


Как известно, типичная программа считывает XML-документ, выполняет некоторые изменения, записывая их при этом в файле. Назначение модуля XML::Simple заключается во всемерной автоматизации этого процесса. В результате вызова подпрограммы происходит считывание XML-документа и сохранение его в памяти. Для представления элементов и данных применяются встроенные хэш-символы. После завершения всех необходимых изменений вызывается другая подпрограмма, выполняющая запись информации в файл.


А теперь перейдем к непосредственным практическим испытаниям. Как и в случае с любым другим модулем, директива use применяется для объявления XML::Simple в программе:


use XML::Simple;

После выполнения этой инструкции XML::Simple в пространство имен экспортирует две подпрограммы:


XMLin() — эта подпрограмма считывает XML-документ из файла или строки и создает структуру, включающую данные и элементы. В ходе осуществления этого процесса возвращается ссылка на хэш, содержащий структуру.

XMLout() — эта подпрограмма, располагая ссылкой на хэш с закодированным документом, генерирует XML-разметку и возвращает ее в виде строки текста.

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


Предположим, что ваш босс собирается отослать сообщения группе пользователей приложения WarbleSoft SpamChucker, управляющего списками рассылки. Одним из свойств этого приложения является возможность импорта/экспорта XML-файлов, представляющих списки рассылки. Единственная проблема в этом случае заключается в том, что боссу затруднительно читать на экране имена пользователей в их исходном виде и он предпочитает, чтобы они отображались с применением заглавных букв. В силу этого требуется написать программу, редактирующую XML-файлы данных и выполняющую требуемые преобразования.


Первой выполняемой задачей в этом случае будет анализ XML-файлов с целью определения стилей разметки. Образец подобного документа приводится в листинге 1.1.


Листинг 1.1. Файл данных SpamChucker


<?xml version="1.0"?>

<spam-document version="3.5" timestamp="2002-05-13 15:33:45">

<!— Автоматически генерируется WarbleSoft Spam, версия 3.5 —>

<customer>

<first-name>Joe</first-name>

<surname>Wrigley</surname>

<address>

<street>17 Beable Ave.</street>

<sity>Meatball</city>

<state>MI</state>

<zip>82649</zip>

</address>

<email>[email protected]</email>

<age>42</age>

</customer>

<customer>

<first-name>Henrietta</first-name>

<surname>Pussycat</surname>

<address>

<street>R.F.D. 2</street>

<city>Flangerville</city>

<state>NY</state>

<zip>83642</zip>

</address>

<email>[email protected]</email>

<age>37</age>

</customer>

</spam-document>

Ознакомившись со страницей perldoc, описывающей модуль XML::Simple, вы сможете чувствовать себя достаточно уверенно и написать небольшой сценарий, показанный в листинге 1.2.


Листинг 1.2. Сценарий, выполняющий замену строчных на прописные буквы в именах заказчиков


# Программа выполняет замену строчных букв на прописные

# в именах заказчиков по всему XML-документу,

# сформированному приложением WarbleSoft SpamChucker..

# Включение ограничений и предупреждений, в этом случае

# вы знаете что делать.

use strict;

use warnings;

# Импорт модуля XML::Simple.

use XML::Simple;

# Включение файла в хэш-ссылку с помощью процедуры

# "XMLin" из модуля

XML::Simple.

# Также включается опция 'forcearray', поэтому

# все элементы

# содержат ссылки на массив.

my $cust_xml = XMLin('./customers.xml', forcearray=<l);

# Выполнение цикла по каждому субхэшу customer,

# причем все объекты хранятся в виде анонимного

# списка под ключом 'customer'.

for my $customer (@{$cust_xml-<{customer}}) {

# Замена строчных на прописные буквы в элементах

#'first-name' и 'surname' путем выполнения встроенной

# функции Perl, uc().

foreach (qw(first-name surname)) {

$customer-<{$_}-<[0] = uc($customer-<{$_}-<[0]);

}

}

# Повторный вывод на печать хэша в виде XML-документа,

# включающего завершающий символ новой строки

# (для улучшения восприятия кода).

print XMLout($cust_xml);

print "n";

В результате выполнения программы (возможно, связанного с некоторыми проблемами, с тех пор как всеми данными распоряжается ваш босс), получаем следующий результат:


<opt version="3.5" timestamp="2002-05-13 15:33:45">

<customer>

<address>

<state>MI</state>

<zip>82649</zip>

<city>Meatball</city>

<street>17 Beable Ave.</street>

</address>

<first-name>JOE</first-name>

<email>[email protected]</email>

<surname>WRIGLEY</surname>

<age>42</age>

</customer>

<customer>

<address>

<state>NY</state>

<zip>83642</zip>

<city>Flangerville</city>

<street>R.F.O. 2</street>

</address>

<first-name>HENRIETTA</first-name>

<email>[email protected]</email>

<surname>PUSSYCAT</surname>

<age>37</age>

</customer>

</opt>

Примите наши поздравления! Вы написали программу, выполняющую обработку XML-кода, которая, к тому же, хорошо работает. Достигнут почти превосходный результат. Применяемое здесь слово «почти» свидетельствует о том, что поведение программы немного отличается от ожидаемого. Поскольку хэш-символы не сохраняют порядок следования содержащихся в них элементов, он будет изменен. Также могут отсутствовать пробелы между элементами. Может ли это представлять проблему?


В рассматриваемом сценарии подчеркивается важная мысль: необходимость компромисса между простотой и сложностью. Как разработчику вам потребуется принять решение относительно того, что составляет важную часть кода, написанного на языке разметки, а что — нет. Иногда имеет значение порядок следования элементов. В этом случае использование модулей, подобных XML::Simple, не допускается. Либо программисту требуется получить доступ к обрабатываемым инструкциям, а также сохранять их в файле. И снова модули, подобные XML::Simple, не обладают подобными возможностями. Поэтому прежде, чем принять решение относительно использования конкретного модуля, требуется оценить его возможности. В данном случае все значительно проще, поскольку вы проконсультировались со своим боссом и проверили программу SpamChucker, воспользовавшись набором измененных данных. В результате были удовлетворены все заинтересованные лица. Полученный и исходный документы похожи, благодаря чему можно прийти к выводу о соответствии требованиям, выдвигаемым к приложению1 . Поэтому считайте, что вы прошли «боевое крещение» и приступили к обработке XML-документа с помощью Perl!
Information
  • Posted on 27.04.2013 18:18
  • Просмотры: 1504