我有一个在xml块中传递的子例程,并试图找到一些元素(使用XML :: LibXML和XPath):
sub new_from_xml {
my $class = shift;
my ( $xml ) = @_;
my $self = {};
foreach (qw[ width height ]) {
$self->{$_} = $xml->findnodes("//$_")->[0]->textContent;
}
$self->{type} = $xml->findnodes("//type")->[0]->textContent;
$self->{url} = URI->new( $xml->findnodes("//url")->[0]->textContent );
return $class->new( $self );
}
从这里开始调用:
sub new_from_xml {
my $class = shift;
my ( $xml ) = @_;
my $self = {};
foreach (qw[id caption orientation]) {
$self->{$_} = $xml->findnodes("//$_")->[0]->textContent;
}
$self->{alt} = $xml->findnodes('//htmlAlt')->[0]->textContent;
foreach my $instance ( $xml->findnodes("//instance") ) {
my $photo =
WWW::NewsReach::Photo::Instance->new_from_xml( $instance );
push @{$self->{instances}}, $photo;
}
return $class->new( $self );
}
我期待的是findnodes()返回的两个<instance> ... </instance>
块,然后当我循环时,我在第一次调用时传递第一个实例,在第二次调用时传递第二个实例。
这是我在调试器中看到的(我在上面的第一个子例程中,WWW :: NewsReach :: Photo :: Instance-&gt; new_from_xml)。
DB<13> x $xml->toString
0 '<instance><width>100</width><height>66</height><type>Small</type><url>http://pictures.newsreach.co.uk/liveimages/Decor-tips-for-guaranteed-unsecured-loans-users.jpg</url></instance>'
好的,这就是我的预期。
DB<14> x $xml->findnodes("//type")->[0]->textContent
0 'Medium'
等等,什么?在toString中显示的XML中没有出现这种情况。这是从哪里来的?
DB<15> x $xml->findnodes("//type")
0 XML::LibXML::Element=SCALAR(0x101d03780)
-> 4334788352
1 XML::LibXML::Element=SCALAR(0x101cdd5c0)
-> 4334949168
嗯,所以有两个<type> ... </type>
元素。
DB<16> x $xml->toString;
0 '<instance><width>100</width><height>66</height><type>Small</type><url>http://pictures.newsreach.co.uk/liveimages/Decor-tips-for-guaranteed-unsecured-loans-users.jpg</url></instance>'
嗯,肯定只是一个<type> ... </type>
元素。这是怎么回事?
为什么toString显示一个<instance> ... </instance>
元素,但显然实际的XML包含两个<instance> ... </instance>
元素?任何帮助将不胜感激。
答案 0 :(得分:3)
//foo
将从文档根开始搜索。你想要.//foo