Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Perl: Общие вопросы > Perl + XML


Автор: AlexanderI 26.7.2006, 11:01
Где посмореть примеры разбора XML ?

Как можно разобрать такую структуру, учитывая что записей несколько сотен ?
Очень хочется посмотреть на примеры.

<?xml version="1.0"?>
<newsL>
 <news date="1.1.2002">
 <title>title 1</title>
 <text>news text 1</text>
 </news>
</newsL>

<socLine>
 <soc dates="1.1.2002">
 <title>title 1</title>
 <text>news text 1</text>
 </socLine>

<socLine>
 <soc dates="1.1.2002">
 <title>title 1</title>
 <text>news text 1</text>
 </socLine>
 

Автор: nitr 26.7.2006, 16:00
поиск на форуме! Или за тебя скрипт писать? Я понимаю если сложный вопрос... обсуждали XML мнооого раз... 

Автор: AlexanderI 26.7.2006, 16:08
Поиск по форому ничего вразумительного не дал. Обсуждались наипростейшие формы. 

Автор: Nab 26.7.2006, 18:25
Да куда уж проще...

тем более что как по мне, так и XML не очень валидный... <soc dates ... > должно быть каким либо способом закрыто....

правда там указана версия 1.0, а я по стандартам особенно и не знаю как оно там было раньше... 

Автор: rcdimon 26.7.2006, 20:51
XML::Parser или что-то в этом духе 

Автор: nitr 26.7.2006, 21:46
все примеры в комплекте с модулем, как установить модуль мы уже писали + в ФАКе тож сказано, но имхо perl -MCPAN -e 'install XML::Parser' лучше ;) 

Автор: korob2001 28.7.2006, 09:36
Модуль XML::Simple, входит в стандартный дистрибутив Perl. Но сразу хочу подправить твой XML, в нём есть несколько ошибок:
Код

<?xml version="1.0"?>
<myxml>
   <newsL>
      <news date="1.1.2002">
      <title>title 1</title>
      <text>news text 1</text>
      </news>
   </newsL>

   <socLine>
      <soc dates="1.1.2002"/>
      <title>title 1</title>
      <text>news text 1</text>
   </socLine>

   <socLine>
      <soc dates="1.1.2002"/>
      <title>title 1</title>
      <text>news text 1</text>
   </socLine>
</myxml>

1.  Добавил корневой тэг <myxml></myxml>. Корневой тэг должен быть всегда, он своего рода оболочка, для всего остального, что в него входит.
2.  У тебя есть тэг <soc dates="1.1.2002"> их кстати несколько, но у них нет закрывающего тэга, т.е. они одиночные. Любой одиночный тэг должен заканчиваться такими символами />, т.е. <soc dates="1.1.2002"/> - это указывает на то, что тэг одиночный, он же открывающий - он же закрывающий.

Теперь напиши или скопируй такой код:
Код

#!/usr/bin/perl
use strict;
use Data::Dumper;
use XML::Simple;

my $xml_file = "C:/file.xml";

my $xml = XMLin($xml_file);

print Dumper($xml);

Испаравь путь к своему XML файлу и запусти его. Увидешь примерно такую структуру:
Код

$VAR1 = {
          'socLine' => [
                       {
                         'text' => 'news text 1',
                         'soc' => {
                                  'dates' => '1.1.2002'
                                },
                         'title' => 'title 1'
                       },
                       {
                         'text' => 'news text 1',
                         'soc' => {
                                  'dates' => '1.1.2002'
                                },
                         'title' => 'title 1'
                       }
                     ],
          'newsL' => {
                     'news' => {
                               'text' => 'news text 1',
                               'date' => '1.1.2002',
                               'title' => 'title 1'
                             }
                   }
        };

Это тебе показал её метод (подпрограмма) Dumper из модуля Data::Dumper. Как ты понял, она(структура) расположена в переменной $xml. Всё остальное уже дело техники. Если тебе известно, что из себя представляют анонимные хеши, анонимные массивы и прочее, думаю ты знаешь, что с этим делать дальше.
Т.е. примерно таким образом можно получить текст:
Код

print $xml->{socLine}[0]{text} . "\n";
 

Автор: AlexanderI 28.7.2006, 09:40
korob2001, Круто ! 

Автор: Celdox 1.8.2006, 12:25
Причем не впервой. Даже так держать говорить не надо.  smile 

 smile 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)