Имея этот код:Выберите 1-ый элемент только - с условием использования XML :: Twig
#!/usr/bin/env perl
use 5.014;
use warnings;
use XML::Twig;
my $twig = XML::Twig->parse(\*DATA);
$twig->set_pretty_print('indented_a');
# 1st search
# this prints OK the all <files> nodes where the <type> == 'release'
$_->print for ($twig->findnodes('//type[string()="release"]/..'));
# 2nd search
# try to get first matched only
my $latest = $twig->findnodes('(//type[string()="release"])[1]/..');
$latest->print;
__DATA__
<root>
<files>
<type>beta</type>
<ver>3.0</ver>
</files>
<files>
<type>alpha</type>
<ver>3.0</ver>
</files>
<files>
<type>release</type>
<ver>2.0</ver>
</files>
<files>
<type>release</type>
<ver>1.0</ver>
</files>
</root>
Вышеприведенные принты
<files>
<type>release</type>
<ver>2.0</ver>
</files>
<files>
<type>release</type>
<ver>1.0</ver>
</files>
error in xpath expression (//type[string()="release"])[1]/.. around (//type[string()="release"])[1]/.. at /opt/anyenv/envs/plenv/versions/5.24.0/lib/perl5/site_perl/5.24.0/XML/Twig.pm line 3648.
разыскиваемого выход из 2-й категории
<files>
<type>release</type>
<ver>2.0</ver>
</files>
например первый узел <files>
, где <type> eq 'release'
.
В соответствии с this answer используемое выражение XPath (//type[string()="release"])[1]/..'
должно работать, но, похоже, я снова пропустил что-то важное.
Не могли бы помочь, пожалуйста?
ДА! Использование 'XML :: Twig :: XPath' и' my ($ latest) = $ twig-> findnodes ('/ root/files [type [string() = "release"]]'); 'решает мои потребности , Спасибо! ;) – cajwine
@cajwine: Надеюсь, я дал понять, что если вы используете только один предикат, например 'my ($ latest) = $ twig-> findnodes ('/ root/files/type [string() =" release " ]/.. ') ', тогда стандартный' XML :: Twig' будет работать нормально – Borodin
Да, просто попробовал оба. Для использования ''/root/files [type [string() = "release"]] ''(из вашего последнего утверждения) мне нужен XPath. А для '/ root/files/type [string() =" release "]/..' достаточно простого 'XML :: Twig'. Замечательный ответ! ;) – cajwine