Чтение XML при помощи XML Simple



Чтение XML при помощи XML::Simple

Мы уже видели один метод, позволяющий анализировать XML-данные при помощи модуля XML::Parser. Чтобы соответствовать правилу TMTOWTDI, давайте снова обратимся к этой проблеме, немного упростив задачу. Многие писали собственные модули, построенные на XML::Parser, для анализа XML-документов и возврата данных в удобной для работы форме объектов/структур данных, к их числу относятся и XML::DOM Энно Дэрксена (Enno Derksen), XML::Grove, и ToObjects (часть libxml-perl) Кена Маклеода (Ken MacLeod), XML: : DT Xoce Xoa Диaca де Альмейды (Jose Joao Dias de Almeida), и XML: : Simple Гранта Маклина (Grant McLean). Из всех этих модулей, вероятно, проще всего использовать модуль XML::Simple. Он был создан для обработки небольших конфигурационных файлов на XML, что отлично подходит для нашей задачи.

XML::Simple предоставляет две функции. Вот первая (в данном контексте):

use XML::Simple;

use Data:: Dumper;

# нужен для вывода содержимого структура данных

Squeuefile = "addqueije. xml":

open(FILE, Squeuefiie) or die "Unable to open Squeuenle : $! \n":

read(FILE. Squeuecontents, -s FILE):

Squeue = XMLin("<queue>".Squejecontents."</qjeue>"):

Содержимое Squeue мы выводим подобным образом:

prim Da la : : Dumper->Di;

mp( [Sqi.euc ] ["uueuo" ])

Теперь это ссылка на данные, найденные в файле очереди, сохраненные в виде хэшей, ключами которого являются элементы <id>.

Мы используем именно такие ключи потому, что XML: : Simple позволяет распознавать в данных конкретные теги, выделяя их среди других в процессе преобразования. Если мы отключим эту возможность:

Squeue = XMLin("<queue>".$queuecontents."</queue>",keyattr=>[]);

то получим ссылку на хэш, где единственное значение является ссылкой на анонимный массив.

Такая структура данных не очень полезна. Этот параметр можно определять по собственному желанию:

$queue = XMLin("<queue>".$qucuecontents."</queue>",keyattr => ["login"]):

Замечательно? Теперь мы можем удалить элементы из очереди в памяти, после того как обработаем их всего в одной строке:

# например, Slogin - "bobf"; delete $queue->{account){$logi");

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

# например, $login="wendyf"; $field="status"

$queue->{account}{$login}{$field}="created";





Содержание раздела