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


Автор: burakov 22.11.2011, 09:07
Добрый день, 
задался целью применить xpath на практике но не получается ,
то ли xpath не правильный, то ли модули не те...

задача:
мне нужно разобрать XML

я нашел модули
Код

    use XML::XPath;
    use XML::XPath::XMLParser;
    my $xp = XML::XPath->new(filename => $file1);
    
    my $nodeset = $xp->find ('/html/body/p'); # find all paragraphs
    
    foreach my $node ($nodeset->get_nodelist) {
        print "FOUND\n\n", 
            XML::XPath::XMLParser::as_string($node),
            "\n\n";
    }



конкретно эти модули отказались с XML работать и дали ошибку 
Couldn't open encmap windows-1251.enc
No such file or directores

наверное что то не доставилось, хотя ошибок при установке не было...

тогда я попробовал модуль для разбора html
Код

 use HTML::TreeBuilder::XPath;
 my $tree= HTML::TreeBuilder::XPath->new;
 $tree->parse_file( "mypage.html");
 my $nb=$tree->findvalue( '/html/body//p[@class="section_title"]/span[@class="nb"]');
 my $id=$tree->findvalue( '/html/body//p[@class="section_title"]/@id');


вроде бы ошибок не дает.... но и не черта не разбирает как я этого хочу , от есть что то находит, что то нет....

ВОПРОС:

1. Можно ли модулем предназначенным для разбора HTML файлов (HTML::TreeBuilder::XPath;) разбирать XML файлы (может это в принципе нельзя делать, а я мучаюсь не пойму почему выбирает не то, что я хочу)

2. Как все таки заставить работать модули
use XML::XPath;
use XML::XPath::XMLParser;
которые из названия своего вроде как предназначены для разбора XML

3. XML который я разбираю я приложил к теме.
Может быть кто нибудь покажет на конкретном примере 
как и чем (какими модулями) выдернуть к примеру <name>наименование акции</name>
из этого приложенного XML, чтобы стало все наглядно и понятно...

Спасибо.





Автор: tishaishii 23.11.2011, 18:48
Код
use XML::LibXML;

print $_->toString, "\n" foreach XML::LibXML->load_xml(IO=>\*DATA)->findnodes(<<'.');
/myxml
    //extra_possibilities[(
        (position() > 2)
    ) or (
        (@key="test")
    )]
.

__END__
<?xml version="1.0" encoding="utf-8"?>

<?xml-stylesheet href="template.xml" type="text/xml"?>

<myxml>
    <name>rgtgh</name>
    <email>ththth</email>
    <year_birth>
        <year>1988</year>
    </year_birth>
    <sex>male</sex>
    <col>2</col>
    <extra_p>
        <extra_possibilities key="test">immortality</extra_possibilities>
        <extra_possibilities>going_through_walls1</extra_possibilities>
        <extra_possibilities>going_through_walls2</extra_possibilities>
        <extra_possibilities>going_through_walls3</extra_possibilities>
    </extra_p>
    <biography>hth5rh4h</biography>
    <familiar>on</familiar>
</myxml>

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