Xml DOM是否提供了使用嵌套语法的可能性?

Xml DOM是否提供了使用嵌套语法的可能性?,xml,perl,mojolicious,Xml,Perl,Mojolicious,如何使用Mojo::DOM模块编写这个示例 #!/usr/bin/env perl use warnings; use 5.012; use XML::LibXML; my $string =<<EOS; <result> <cd> <artists> <artist class="1">Pumkinsingers</artist> <artist class="2"&

如何使用Mojo::DOM模块编写这个示例

#!/usr/bin/env perl
use warnings;
use 5.012;
use XML::LibXML;

my $string =<<EOS;
<result>
    <cd>
    <artists>
        <artist class="1">Pumkinsingers</artist>
        <artist class="2">Max and Moritz</artist>
    </artists>
    <title>Hello, Hello</title>
    </cd>
    <cd>
    <artists>
        <artist class="3">Green Trees</artist>
        <artist class="4">The Leons</artist>
    </artists>
    <title>The Shield</title>
    </cd>
</result>
EOS
#/
my $parser = XML::LibXML->new();
my $doc = $parser->load_xml( string => $string );
my $root = $doc->documentElement;

my $xpath = '/result/cd[artists/artist[@class="2"]]/title';

my @nodes = $root->findnodes( $xpath );
for my $node ( @nodes ) {
    say $node->textContent;
}
#/usr/bin/env perl
使用警告;
使用5.012;
使用XML::LibXML;
my$string=load_xml(string=>$string);
我的$root=$doc->documentElement;
my$xpath='/result/cd[artists/artist[@class=“2”]]/title';
my@nodes=$root->findnodes($xpath);
对于我的$node(@nodes){
说$node->textContent;
}
嗯,这不是很明显吗

使用Mojo::DOM;
my$string=find($xpath);
打印“\n2”、$dom->find('.2');
打印“\n3”,$dom->find('artist.2');
打印“\n4”,$dom->find('artists.2');
打印“\n5”,$dom->find('artists.2')->[0]->parent;
打印“\n6”、$dom->find('artists.2')->[0]->parent->parent;
打印“\n7”,$dom->find('artists-artist.2')->[0]->parent->parent->find('title');
打印“\n8”、$dom->find('artists-artist.2')->[0]->parent->parent->find('title')->[0]->文本;
打印“\n9”、$dom->find('artists-artist.2')->[0]->parent->parent->find('title')->first->text;
$dom->find('artists.2')->每个(子{
打印“\n10”,$\u0]->父级->父级->查找('title')->第一个->文本;
});
__结束__
1.
2马克斯和莫里茨
3马克斯和莫里茨
4马克斯和莫里茨
5.
抽水机
马克斯和莫里茨
6.
抽水机
马克斯和莫里茨
你好,你好
你好,你好
你好,你好
你好,你好
你好,你好

Mojo::DOM支持CSS3选择器,这很了不起,但不如xpath那么通用;CSS3不提供在下降到节点后上升的方式

你可以完成同样的事情,尽管这需要更多的参与:

Mojo::DOM->new($string)
  ->find('result:root > cd > artists > artist.2')
  ->each(sub { say shift->parent->parent->title->text });

Mojo::DOM->new($string)
  ->find('result:root > cd > artists > artist.2')
  ->each(sub { say shift->parent->parent->title->text });
say $_->parent->parent->title->text
  for Mojo::DOM->new($string)
    ->find('result:root > cd > artists > artist.2')->each;