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


Автор: korob2001 22.3.2004, 15:47
Привет, всем!
Недавно приобрёл книгу Perl & XML. Авторы: Джейсон Макинтош и Эрик Т.Рэй.
В первой главе приводится пример работы модуля XML::Simple, попробовал его реализовать, но ничего не вышло.
Вот так выглядит XML-ФАЙЛ:
Код

<?xml version="1.0"?>
<spam-document version="3.5" timestamp="2002-05-13 15:33:45">
<!- Автоматически генерируется WarbleSoft Spam, версия 3.5 ->
<customer>
    <first-name>Joe</first-name>
    <surname>Wrigley</surname>
    <address>
         <country>USA</country>
         <street>17 Beable Ave.</street>
         <sity>Meatball</city>
         <state>MI</state>
         <zip>82649</zip>
    </address>
    <email>joewrigley@jmac.org</email>
    <age>42</age>
</customer>
<customer>
    <first-name>Henrietta</first-name>
    <surname>Pussycat</surname>
    <address>
         <country>USA</country>
         <street>R.F.D. 2</street>
         <city>Flangerville</city>
         <state>NY</state>
         <zip>83642</zip>
    </address>
    <email>meow@263A.org</email>
    <age>37</age>
</customer>
</spam-document>

А так вот выглядит Perl-скрипт:
Код

#!/usr/bin/perl -w
use strict;
use warnings;
use XML::Simple;
my $file_xml = '../xml/SpamChucker.xml';
my $cust_xml = XMLin( $file_xml, forcearray => 1 );
foreach my $customer ( @{$cust_xml->{ customer }} ) {
  foreach ( qw|first-name surname| ) {
        $customer->{$_}->[0] = uc( $customer->{$_}->[0] );
  }
}
print XMLout( $cust_xml );
print "\n";

После выполнения программы имена и фамилии должны быть в верхнем регистре, а у меня выводится следующее сообщение:
Цитата

not well-formed (invalid token) at line 3, column 3, byte 87 at D:/usr/site/lib/XML/Parser.pm line 187

Что бы это значило?

Заранее благодарен,
Денис

Автор: ElectricalStorm 22.3.2004, 22:29
мне кажется проблема в валидности самого XML

Автор: korob2001 23.3.2004, 01:07
Цитата

мне кажется проблема в валидности самого XML

Мне тоже так кажется, но с другой стороны это ведь пример из книги. hmmm.gif
Сразу же после этих листингов в книге написано:
Примите наши поздравления! Вы написали программу, выполняющую обработку XML-кода, которая, ктому же, хорошо работает. rolleyes.gif Достигнут почти превосходный результат.

Автор: korob2001 23.3.2004, 01:42
Гы, попробовал написать такой XML:
Код

<personnel-record>
  <name>
      <first>rita</first>
      <last>book</last>
  </name>
  <birthday>
      <year>1969</year>
      <month>4</month>
      <day>23</day>
  </birthday>
</personnel-record>

и такой Perl скрипт:
Код

#!/usr/bin/perl -w
use strict;
use warnings;
use XML::Simple;
my $cust_xml = XMLin( "../xml/second.xml", forcearray => 1 );
for my $customer ( @{ $cust_xml->{ name } } ) {
          foreach ( qw( first last ) ) {
               $customer->{ $_ }->[ 0 ] = uc( $customer->{ $_ }->[ 0 ] );
          }
}
print XMLout( $cust_xml );
print "\n";

Всё заработало, на ура.
Только я так и не понял почему.

Если кто-то сможет пояснить причину, пожалуйста пролейте свет на такое поведение программы.

Заранее спасибо.

Автор: ElectricalStorm 23.3.2004, 07:33
что бы в вашем случае XML стал валидным надо заменить спец символы типа @ на соответствующие коды в DTD

Автор: korob2001 31.3.2004, 03:00
Большое спасибо ElectricalStorm

Автор: achmed 9.4.2004, 08:28
хы, в xml русские буквы,
<!- Автоматически генерируется WarbleSoft Spam, версия 3.5 ->
а кодировка в шапке не указана,
надо типа этого
<?xml version="1.0" encoding="KOI-8"?>
или убрать русские буквы

Автор: korob2001 10.4.2004, 13:36
Удаляю строку с русскими буквами, получаю следующю ошибку:
mismatched tag at line 9, column 25, byte 271 at Z:/usr/site/lib/XML/Parser.pm line 168
sad.gif

Автор: achmed 10.4.2004, 19:54
кстати комментарии в xml обзначаются так: <! comment ... -->
а не <! comment ->
как эдесь:
<!- Автоматически генерируется WarbleSoft Spam, версия 3.5 ->

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

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