У меня есть эта подпрограмма, которая передается в фрагменте 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 );
}
То, что я ожидаю, это два <instance> ... </instance>
блока, которые возвращает findnodes (), затем, когда я повторяю цикл, я передаю первый экземпляр при первом вызове и второй экземпляр при втором вызове.
Этоэто то, что я вижу в отладчике (я в первой подпрограмме выше, WWW :: NewsReach :: Photo :: Instance-> 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'
Подожди, что?Этого не было в XML, показанном из toString.Откуда это взялось?
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>
элемента?Любая помощь будет принята с благодарностью.