使用 findnodes() 在处理程序中使用相对XPath Selection 找到了 Contents/Message 子节点:
findnodes()
Selection
Contents/Message
#!/usr/bin/perl use warnings; use strict; use XML::Twig; my %selections; my $twig = XML::Twig->new( twig_handlers => { Selection => sub { #$_->print(); print "selection id: ", $_->att('id'), "\n"; my @messages; foreach my $message ($_->findnodes('./Contents/Message')) { #$message->print(); print "message refid: ", $message->att('refid'), "\n"; # store "refid" attribute in messages list push(@messages, $message->att('refid')); } # store collected Message nodes under selection ID $selections{ $_->att('id') } = \@messages; }, } ); $twig->parse(\*DATA); while (my($id, $messages) = each %selections) { print "Selection '${id}' messages: @{ $messages }\n"; } exit 0; __DATA__ <?xml version="1.0" encoding="UTF-8"?> <Root> <Selection id="54008473"> <Name>Master</Name> <Contents> <Message refid="125796458" suppress="true" status="Unchanged"/> <Message refid="123991123" suppress="true" status="Unchanged"/> <Message refid="128054778" custom="true" status="New"> <Content language="en"><![CDATA[<p>ada</p>]]></Content> </Message> </Contents> <Messages/> <MessagePriority> <Zone name="Insured Letter Intro"> <MessageInstance id="125796375" name="LD Letter Introduction" status="Active" delivery="Mandatory" priority="1" suppressed="false" selected="true"/> </Zone> <Zone name="Insured Letter Logo"> <MessageInstance id="125794623" name="Insured Letter Logo" status="Active" delivery="Mandatory" priority="1" suppressed="false" selected="true"/> </Zone> </MessagePriority> </Selection> <Selection id="54008475" datavaluerefid="54008479"> <Name>RMBC</Name> <Contents> <Message refid="125796458" sameasparent="true" parentrefid="54008473" status="Unchanged"/> <Message refid="123991123" sameasparent="true" parentrefid="54008473" status="Unchanged"/> <Message refid="128054778" custom="true" status="New"> <Content language="en"><![CDATA[<p>ada</p>]]></Content> </Message> </Contents> <Messages/> <MessagePriority> ... </MessagePriority> </Selection> </Root>
测试运行:
$ perl dummy.pl selection id: 54008473 message refid: 125796458 message refid: 123991123 message refid: 128054778 selection id: 54008475 message refid: 125796458 message refid: 123991123 message refid: 128054778 Selection '54008473' messages: 125796458 123991123 128054778 Selection '54008475' messages: 125796458 123991123 128054778