際際滷

際際滷Share a Scribd company logo
Преобразование
Perl-структур в XML
Екатерина Трефилова
Lecharton
XML::Simple
Не рекомендуется к использованию.
XML::Bare
XML::TreePP
XML::Fast
XML::LibXML
XML: : SAX
Пример XML-файла
<?xml?version="1.0"?encoding="UTF?8"??>
<order?id="1">
????<user?login="daz"?/>
????<header>Book</header>
????<comment>Very?Nice</comment>
????<name>Programming?Perl</name>
????<price>1350</price>
</order>
pars.pl
use?Data::Dumper;
use?XML::Simple;
my?$xml_simple?=?XML::Simple?>new();
my?$data?=?
$xml_simple?>XMLin('test.xml');
print?Dumper($data);
Выходные данные
$VAR1?=?{
?'comment'?=>?'Very?Nice',
?'name'?=>?'Programming?Perl',
?'user'?=>?{
?????????????'login'?=>?'daz'
???????????},
?'price'?=>?'1350',
?'id'?=>?'1',
?'header'?=>?'Book'
};
<?xml?version="1.0"?encoding="UTF?8"??>
<item>
<order?id="1">
????<user?login="daz"?/>
????<header>Book</header>
????<comment>Very?Nice</comment>
????<name>Programming?Perl</name>
????<price>1350</price>
</order>
<order?id="2">
????...
</order>
</item>
Пример более сложного XML файла
$VAR1?=?{
'order'?=>?{
'Mastering?Regular?Expressions'?=>?{
'comment'?=>?'This?is?a?GREAT?book!',
'user'?=>?{
'login'?=>?'tom'
},
'id'?=>?'2',
'price'?=>?'1199',
'header'?=>?'Book'
},
'Programming?Perl'?=>?{
'comment'?=>?'Very?Nice',
´
}
}
};
Выходные данные
use?Data::Dumper;
use?XML::Simple;
my?$xml_simple?=?XML::Simple?>new();
my?$data?=?
$xml_simple?>XMLin('test.xml',?
KeepRoot?=>?1,?KeyAttr?=>?'');
print?Dumper($data);
Указываем опции
$VAR1 = {
'item' => {
'order' => [
{
'comment' => 'Very Nice',
'name' => 'Programming Perl',
'user' => {
'login' => 'daz'
},
'price' => '1350',
'id' => '1',
'header' => 'Book'
},
{
'comment' => 'This is a GREAT book!',
'name' => 'Mastering Regular Expressions',
...
}]
}
};
Выходные данные
? ? :Добавим количество страниц
$doc?>{item}?>{order}?>{pages}?=?'1104';
say?($xml_simple?>XMLout($doc));
?xml:Полученный ?
<opt>
??<item?name="Programming?Perl"?
Pages="1104"?comment="Very?Nice"?
header="Book"?id="1"?price="1350">
????<user?login="daz"?/>
??</item>
</opt>
$doc?>{item}?>{order}?>{pages}?=?['1104'];
say?($xml_simple?>XMLout($doc,?
KeepRoot?=>?1,?
XMLDecl?=>?"<?xml?version='1.0'?>"));
Указываем опции для XMLout()
XML::Simple ! зло!
XML::Simple
XML::Bare
XML::TreePP
XML::Fast
XML::LibXML
XML: : SAX
use?Data::Dumper;
use?XML::Bare;
my?$ob?=?new?XML::Bare(file?=>?'test.xml'?);
my?$root?=?$ob?>parse();
print?Dumper($root);
pars.pl
$VAR1?=?{
...
'order'?=>?{
'value'?=>?'',
'_pos'?=>?1,
'_i'?=>?150631033,
'_z'?=>?204,
'name'?=>?{
'_z'?=>?171,
'_i'?=>?150631136,
'value'?=>?'Programming?Perl',
'_pos'?=>?5
},
'id'?=>?{
'_att'?=>?1,
'value'?=>?'1'
},
...
},
};
Выходные данные pars.pl
? ? :Добавим количество страниц ?
$root?>{order}?>{pages}?>{value}?=?'1104';
my?$new_xml?=?$ob?>xml(?$root?);
say?$new_xml;
?xml:Полученный ?
<order?id="1">
??<pages>1104</pages>
??<user?login="daz"?/>
??<header>Book</header>
??<comment>Very?Nice</comment>
??<name>Programming?Perl</name>
??<price>1350</price>
</order>
XML::Simple
XML::Bare
XML::TreePP
Простая реализация разбора и записи
XML-документов
XML::Fast
XML::LibXML
XML: : SAX
use?Data::Dumper;
use?XML::TreePP;
my?$tpp?=?XML::TreePP?>new();
my?$tree?=?$tpp?>parsefile(?"test.xml"?);
print?Dumper($tree);
pars.pl
$VAR1?=?{
'item'?=>?{
'order'?=>?[{
'comment'?=>?'Very?Nice',
'user'?=>?{
'?login'?=>?'daz'
},
'name'?=>?'Programming?Perl',
'price'?=>?'1350',
'?id'?=>?'1',
'header'?=>?'Book'
},
{
'comment'?=>?'This?is?a?GREAT?book!',
...
}
]}
};
Выходные данные
? ? :Добавляем новый элемент ?
$tree?>{item}?>{order}?>{pages}?=?'1104';
my?$xml?=?$tpp?>write(?$tree?);
say?$xml;
xml:
<?xml?version="1.0"?encoding="UTF?8"??>
<item>
<order?id="1">
<comment>Very?Nice</comment>
<header>Book</header>
<name>Programming?Perl</name>
<pages>1104</pages>
<price>1350</price>
<user?login="daz"?/>
</order>
...
</item>
XML::Simple
XML::Bare
XML::TreePP
XML::Fast
Простой и быстрый парсер XML-документов
XML::LibXML
XML: : SAX
use?XML::Fast;
use?Data::Dumper;
my?$xml?=?
'<?xml?version="1.0"?encoding="UTF?8"??>
<order?id="1">
????<user?login="daz"?/>
????<header>Book</header>
????<price>1350</price>
</order>';
??
my?$hash?=?xml2hash?$xml,?attr?=>?'.',?
text?=>?'~';
print?Dumper($hash);
pars.pl
$VAR1?=?{
'order'?=>?{
'comment'?=>?'Very?Nice',
'name'?=>?'Programming?Perl',
'user'?=>?{
'.login'?=>?'daz'
},
'price'?=>?'1350',
'.id'?=>?'1',
'header'?=>?'Book'
}
};
Выходные данные
Минусы
¢ Не удобны для сложных преобразований;
¢ Не всегда корректно работают с
кодировками;
¢ При вводе данных весь документ
считывается в память;
DOM
(Document Object Model)
DOM представляет XML-документ как дерево
двунаправленных узлов.
XML::LibXML
Оболочка для libxml2 проекта Gnome
XML::Simple
XML::Bare
XML::TreePP
XML::Fast
XML: : SAX
use?XML::LibXML;
my?$parser?=?XML::LibXML?>new;
my?$doc?=?$parser?>parse_file('test.xml');
my?$root?=?$doc?>documentElement();
my?$pages_in_book?=?{
'1'?=>?'1104',
'2'?=>?'1255',
};
my?@nodeList?=?$doc?>getElementsByTagName('order');
foreach?my?$order?(@nodeList)?{
my?$id?=?$order?>getAttribute('id');
my?$pages?=?$order?>addNewChild('',?'pages');
my?$val?=?
$doc?>createTextNode($pages_in_book?>{$id});
$pages?>addChild($val);
}
print?$doc?>toString(1);
pars.pl
<?xml?version="1.0"?encoding="UTF?8"?>
<item>
????<order?id="1">
????????<user?login="daz"/>
????????<header>Book</header>
????????<comment>Very?Nice</comment>
????????<name>Programming?Perl</name>
????????<price>1350</price>
?????? ?<pages>1104</pages></order>
????<order?id="2">
????????<user?login="tom"/>
????????...
????????<price>1199</price>
????????<pages>1255</pages></order>
</item>
Полученный XML
Работа с потоками
Поток - последовательность обрабатываемых
фрагментов данных.
¢ поток состоит из последовательности фрагментов
данных (маркеров);
¢ имеет значение последовательность
передаваемых фрагментов;
¢ не имеет значение источник данных;
Код, обрабатывающий конкретный тип маркера,
называется обработчиком.
Для каких задач подходит потоковая
обработка?
¢ фильтр
¢ селектор
¢ сумматор
¢ преобразователь
Не подходит если программе нужно
"заглянуть" в далекое прошлое или близкое
будущее.
SAX
(Simple API for XML)
Интерфейс управляемый событиями
XML::LibXML ! хотя и имеет интерфейс
SAX, парсер DOM
XML: : SAX: : ParserFactory ! определяет
удобный способ выполнения
вспомогательных, рутинных операций
XML::SAX::ExpatXS ! оболочка для
испытанного парсера expat
test.xml
<item>
????<order?user='daz'?price='1350'?id='1'?/>
????<order?user='tom'?price='1199'?id='2'?/>
</item>
test.pl
use?XML::SAX::ParserFactory;
use?XML::SAX::Writer;
my?$writer?=?XML::SAX::Writer?>new;
$XML::SAX::ParserPackage?=?"XML::SAX::ExpatXS";
my?$parser?=?XML::SAX::ParserFactory?>parser(
Handler?=>?$writer?);
eval?{?$parser?>parse_file('test.xml')?};
?
#?or?or?$p?>parse_string("<foo/>"),
#?$p?>parse_uri("foo.xml")
Если Вы работаете с XML...
¢ Не делайте файлы слишком большими;
¢ Не используйте пространства имен, если в
этом нет острой необходимости;
¢ Используйте XML Schema;
¢ Нумеруйте версии;
Итог
XML::Simple ! лучше не использовать;
XML::Bare ! когда важен порядок элементов;
XML::TreePP ! для быстрого парсинга документов, с
простой структурой;
XML::Fast ! если есть вероятность, что XML не валиден;
XML::LibXML ! для документов со сложной структурой;
XML: : SAX ! для большого объема информации;
СПАСИБО!
Perl developers: Fill your XML toolbox
http://www.ibm.com/developerworks/library/x-perl-xml-toolki
t/?S_TACT=105AGX99&S_CMP=CP
XML для разработчиков Perl
http://www.ibm.com/developerworks/ru/library/x-xmlperl1/index.h
tml#N10217
Perl & XML. Библиотека программиста
Джейсон Макинтош, Эрик Т. Рей
ВОПРОСЫ

More Related Content

Преобразование Perl-структур в XML. Трефилова Екатерина. Moscow.pm 6 июля 2013