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


Автор: BaldHeaded2 11.10.2007, 11:42
доброе время суток.

ОС: FreeBSD 5.3
Perl 5

есть xml-документ (encoding="Windows-1251"). названия элементов и атрибутов в нем в кириллице.
не подскажите, отчего парсеры (XML::Simple, XML::XPath, XML::Twig) начинают ругаться, встречая
в параметрах своих методов, кириллицу?
причём именно в параметрах. пробегаясь по элементам в цикле - все нормально.
Код

# XML::Simple
my $tree = $xs->XMLin($xml);
foreach (keys %{$tree}) {
    $_ = Encode::encode('cp1251', $_);
    if ($_ =~ /^объект$/) {
        print $_; # работает
    }
}

XML::Simple.
Код

my $xs = XML::Simple->new(KeyAttr => {
    'объект' => "+аттр",
    'объект_блабла' => "+аттр",
    'объект_блаблабла' => "+аттр"
});

отрабатывает без ошибок, но на парсинг документа никак не отражается.

XML::XPath
Код

my $xp = XML::XPath->new(filename => $xml);
my $nodeset = $xp->find('/объект');

выдает
Query: /объект... ^^^ Invalid query somewhere around here (I think)

XML::Twig
Код

my $t = new XML::Twig(
    TwigHandlers => {
        "объект" => \&object});

выдает
unrecognized expression in handler: 'объект'

Автор: nitr 13.10.2007, 21:50
example1.xml
Код
<?xml version='1.0' encoding='windows-1251'?>
<block path="," page="1"><catalog><categories><пункт имя_аттр="1" count="4620"><имя>Имя1</имя></пункт><пункт имя_аттр="3" count="7799"><имя>Имя2</имя></пункт><пункт имя_аттр="9" count="648"><имя>Имя3</имя></пункт><пункт имя_аттр="5" count="1012"><имя>Имя4</имя></пункт><пункт имя_аттр="8" count="3842"><имя>Имя5</имя></пункт><пункт имя_аттр="4" count="387"><имя>Имя6</имя></пункт><пункт имя_аттр="2" count="1073"><имя>Имя7</имя></пункт><пункт имя_аттр="6" count="48"><имя>Имя8</имя></пункт><пункт имя_аттр="7" count="1388"><имя>Имя9</имя></пункт></categories></catalog></block>


example1.pl
Код

#!/usr/bin/perl
use strict;
use warnings;

use XML::Twig;
use Encode 'encode', 'decode';

open my $flh, '<', 'example1.xml';
local $/;
my $content = <$flh>;
close $flh;

my $_parsexml_categories = sub {
    my ($name) = $_->find_nodes(_encode('имя'));
    my $path = $_->att(_encode('имя_аттр')) if $_->has_atts;
    print encode('cp1251', $name->text."\t".$path)."\n";
};

my $xml_items = XML::Twig->new( twig_roots => { 
        'categories/'._encode('пункт') => $_parsexml_categories,
    });
$xml_items->parse($content);
$xml_items->purge;

sub _encode {
    my $str = shift;
    return decode('cp1251', $str);
}


Цитата
Имя1    1
Имя2    3
Имя3    9
Имя4    5
Имя5    8
Имя6    4
Имя7    2
Имя8    6
Имя9    7


Добавлено через 6 минут и 57 секунд
файл example1.pl сохранён в кодировке windows (cp1251).
Можно обойтись без функции _encode

а заюзать
Код

#!/usr/bin/perl
use strict;
use warnings;
use encoding 'windows-1251';

use XML::Twig;
use Encode 'encode';
...


у вас скорее кодировка KOI8-R, поэтому
Код

use encoding 'koi8-r';

Автор: BaldHeaded2 15.10.2007, 10:39
спасибо! понял свои ошибки. учусь дальше.

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