Mit diesem Code:nur - mit der Bedingung unter Verwendung von 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>
Die obigen Drucke
<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.
Die wollte Ausgabe von der zweiten Suche
<files>
<type>release</type>
<ver>2.0</ver>
</files>
z der erste <files>
Knoten, wo die <type> eq 'release'
.
Laut this answer sollte der verwendete XPath-Ausdruck (//type[string()="release"])[1]/..'
funktionieren, aber anscheinend habe ich wieder etwas Wichtiges verpasst.
Könnte jemand bitte helfen?
JA! Mit 'XML :: Twig :: XPath' und den' my ($ neustest) = $ twig-> findnodes ('/ root/files [type [string() = "release"]]) "löst ich meine Bedürfnisse . Vielen Dank! ;) – cajwine
@cajwine: Ich hoffe, ich habe klargestellt, dass wenn man nur ein Prädikat verwendet, wie 'my ($ latest) = $ twig-> findnodes ('/ root/files/type [string() =" release " ]/.. ') ', dann funktioniert der Standard' XML :: Twig' gut – Borodin
Ja, nur beides ausprobiert. Für die Verwendung der '/ root/files [type [string() =" release "]]' '(von Ihrer letzten Aussage) brauche ich den XPath. Und für '/ root/files/type [string() =" release "]/..' reicht der einfache 'XML :: Twig'. Wunderbare Antwort! ;) – cajwine