SlideShare a Scribd company logo
1 of 37
Преобразование
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

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

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

Вебинар Томулевича materialized.path 2
Вебинар Томулевича materialized.path 2 Вебинар Томулевича materialized.path 2
Вебинар Томулевича materialized.path 2
 
Neuperl6
Neuperl6Neuperl6
Neuperl6
 
Ленивые итераторы для разбора разнородных данных. Михаил Озеров. Moscow.pm 6 ...
Ленивые итераторы для разбора разнородных данных. Михаил Озеров. Moscow.pm 6 ...Ленивые итераторы для разбора разнородных данных. Михаил Озеров. Moscow.pm 6 ...
Ленивые итераторы для разбора разнородных данных. Михаил Озеров. Moscow.pm 6 ...
 
Aspetos gerais de desenvolvimento web.
Aspetos gerais de desenvolvimento web.Aspetos gerais de desenvolvimento web.
Aspetos gerais de desenvolvimento web.
 
Ria的强力后盾:rest+海量存储
Ria的强力后盾:rest+海量存储 Ria的强力后盾:rest+海量存储
Ria的强力后盾:rest+海量存储
 
Core rest edgarsilva_v1
Core rest edgarsilva_v1Core rest edgarsilva_v1
Core rest edgarsilva_v1
 
ADO.NET Entity Framework 4
ADO.NET Entity Framework 4ADO.NET Entity Framework 4
ADO.NET Entity Framework 4
 
автоматизация Flex приложений с помощью selenium rc
автоматизация Flex приложений с помощью selenium rcавтоматизация Flex приложений с помощью selenium rc
автоматизация Flex приложений с помощью selenium rc
 

More from Moscow.pm

Язык Go для Perl-программистов v1.1. Александр Орловский. Moscow.pm 4 июля 2013
Язык Go для Perl-программистов v1.1. Александр Орловский. Moscow.pm 4 июля 2013Язык Go для Perl-программистов v1.1. Александр Орловский. Moscow.pm 4 июля 2013
Язык Go для Perl-программистов v1.1. Александр Орловский. Moscow.pm 4 июля 2013
Moscow.pm
 

More from Moscow.pm (10)

О работе с документами .xls, .xlsx, .rtf
О работе с документами .xls, .xlsx, .rtfО работе с документами .xls, .xlsx, .rtf
О работе с документами .xls, .xlsx, .rtf
 
Fast queue – как мы сделали свою очередь на perl и redis
Fast queue – как мы сделали свою очередь на perl и redisFast queue – как мы сделали свою очередь на perl и redis
Fast queue – как мы сделали свою очередь на perl и redis
 
Пластилиновый код: как перестать кодить и начать жить
Пластилиновый код: как перестать кодить и начать житьПластилиновый код: как перестать кодить и начать жить
Пластилиновый код: как перестать кодить и начать жить
 
Perl для не программистов. Николай Мишин. Moscow.pm 4 июля 2013
Perl для не программистов. Николай Мишин. Moscow.pm 4 июля 2013Perl для не программистов. Николай Мишин. Moscow.pm 4 июля 2013
Perl для не программистов. Николай Мишин. Moscow.pm 4 июля 2013
 
Язык Go для Perl-программистов v1.1. Александр Орловский. Moscow.pm 4 июля 2013
Язык Go для Perl-программистов v1.1. Александр Орловский. Moscow.pm 4 июля 2013Язык Go для Perl-программистов v1.1. Александр Орловский. Moscow.pm 4 июля 2013
Язык Go для Perl-программистов v1.1. Александр Орловский. Moscow.pm 4 июля 2013
 
Разработка документации для RESTful API: как убить трёх зайцев одним. Moscow....
Разработка документации для RESTful API: как убить трёх зайцев одним. Moscow....Разработка документации для RESTful API: как убить трёх зайцев одним. Moscow....
Разработка документации для RESTful API: как убить трёх зайцев одним. Moscow....
 
Особенности создания XS-модулей на языке C++. Владимир Тимофеев. Moscow.pm 4 ...
Особенности создания XS-модулей на языке C++. Владимир Тимофеев. Moscow.pm 4 ...Особенности создания XS-модулей на языке C++. Владимир Тимофеев. Moscow.pm 4 ...
Особенности создания XS-модулей на языке C++. Владимир Тимофеев. Moscow.pm 4 ...
 
Не верь никому или разработка эффективных приложений (Как писать по настоящем...
Не верь никому или разработка эффективных приложений (Как писать по настоящем...Не верь никому или разработка эффективных приложений (Как писать по настоящем...
Не верь никому или разработка эффективных приложений (Как писать по настоящем...
 
Play Perl — распределенная социальная игра для Perl-разработчиков. Вячеслав М...
Play Perl — распределенная социальная игра для Perl-разработчиков. Вячеслав М...Play Perl — распределенная социальная игра для Perl-разработчиков. Вячеслав М...
Play Perl — распределенная социальная игра для Perl-разработчиков. Вячеслав М...
 
Динамический код: модифицируем таблицу символов во время выполнения. Елена Ши...
Динамический код: модифицируем таблицу символов во время выполнения. Елена Ши...Динамический код: модифицируем таблицу символов во время выполнения. Елена Ши...
Динамический код: модифицируем таблицу символов во время выполнения. Елена Ши...
 

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