Почему XML :: LibXML-> toString () показывает ожидаемый XML, но findnodes () находит больше XML? - PullRequest
0 голосов
/ 27 февраля 2011

У меня есть эта подпрограмма, которая передается в фрагменте 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> элемента?Любая помощь будет принята с благодарностью.

1 Ответ

3 голосов
/ 27 февраля 2011

//foo начнет поиск из корня документа.Вы хотите .//foo

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...