Создание XMLфайла из Perl



Создание XML-файла из Perl

Давайте вернемся к событиям, о которых мы говорили в разделе «Права пользователей в NT/2000». Тогда речь шла о том, что необходимо записать информацию об учетной записи, получаемую посредством функции Collectlnformation(), в файл очереди. Но мы так и не видели примеров программы, выполняющей эту задачу. Давайте посмотрим, как записывается этот файл в формате XML.

Проще всего создать XML-файл при помощи простых операторов, но мы поступим лучше. Модули ХМl : Бенджамина Холзмана (Benjamin Holzman) и XML: Дэвида Меггинеона (David Megginson) могут упростить этот процесс и сделать его менее подверженным ошибкам. Они могут обработать такие детали, как соответствие открывающих/закрывающих тегов, а также позаботятся об экранировании специальных символов (<, >, & и т. д.). Вот пример программы, применяемой в нашей системе учетных записей для создания кода XML при помощи модуля XML: :Writer:

sub AppendAccountXML {

получаем полный путь к файлу

my $filename = shift;

ft получаем ссылку на анонимный хэш записи

ту Irecord = shift;

и XML::Writer использует объекты IO::File для управления и выводом use 10::File;

# дописываем в этот файл $fh = new 10: :File("»$filename") or die "Unable tt append to file:$!\n";

# инициализируем модуль XML::Writer и говорим ему

# записывать данные в файловый дескриптор

$fh use XML;;Writer; my $w = new XML::Writer(OUTPUT => $fh);

# записываем открывающий тег для каждой записи <account> $w->startTag("account");

# записываем открывающие/закрывающие внутренние теги и

# данные в <account>

foreach my $field (keys %{$record}){



print $fh "\n\t";

$w->startTag($field);

$w->characters($$record{$field});

$w->endTag;

}

print $fh "\n";

# записываем закрывающий тег для каждой записи <account>

$w->endTag;

$w->end;

$fh->close();

}

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

&AppondAcco:jntXML($addqueue. ^Collect In formation);

Вот что получается в результате работы этой подпрограммы:

<account>

<login>bobf</]ogin>

<fullname>Boh Fate'/fiil lr.ame>

<id>24-9057</iri>

<type>staff</type>

<password>passwora</password>

<status>to_be_created</5tatus>

</account>

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

Функция AppendAccountXML() будет применяться еще раз, когда мы захотим записать данные в очередь удаления и в нашу базу данных учетных записей.

Использование модуля XML: :Writer в подпрограмме AppendAccountXMLO имеет несколько преимуществ:

  • Код получается достаточно читаемым, и тот, кто хоть немного разбирается в языках разметки, сразу же сориентируется в именах startTagO, charactersQ и endTag().
  • И хотя в нашем случае этого не понадобится, функция character () обеспечивает некоторую защиту - она экранирует зарезервированные символы, например символ (>).
  • Мы не должны запоминать последний открывающий тег, чтобы потом добавить соответствующий закрывающий. XML: : Write г заботится об этом за нас и позволяет вызвать функцию eridTag(), не указывая, какой закрывающий тег нам нужен. В нашем случае отслеживание парных тегов не так существенно, поскольку отсутствует их глубокая вложенность, но такая возможность становится очень важной в других ситуациях, где используются более сложные элементы.


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