为什么XML :: LibXML-> toString()显示了预期的XML,但findnodes()找到了更多的XML?

时间:2011-02-27 13:37:38

标签: xml perl xpath

我有一个在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>元素?任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:3)

//foo将从文档根开始搜索。你想要.//foo