2016-01-20 6 views
1
my $doc = $parser->parse_string($res->content); 
my $root = $doc->getDocumentElement; 
my @objects = $root->getElementsByTagName('OBJECT'); 

foreach my $object (@objects){ 
my $name = $object->firstChild; 
print "OBJECT = " . $name . "\n";} 


OUTPUT is: 
OBJECT = XML::LibXML::Text=SCALAR(0x262e170) 
OBJECT = XML::LibXML::Text=SCALAR(0x2ee4b00) 
OBJECT = XML::LibXML::Text=SCALAR(0x262e170) 
OBJECT = XML::LibXML::Text=SCALAR(0x2ee4b00) 

Может ли кто-нибудь объяснить, почему печать печатает значения атрибутов $name? Почему он печатает нормально, когда я использую функцию getAttribute практически с тем же кодом?Печать с использованием XML :: LibXML

+0

Можете ли вы показать XML? Какую версию 'XML :: LibXML' вы запускаете? – choroba

+0

Я подозреваю, что вы ищете определенный дочерний элемент, но упустили, что могут быть дочерние текстовые узлы с пробелом. Поэтому, пожалуйста, покажите образец ввода XML и объясните, какие данные вы ищете. –

ответ

3

getAttribute возвращает атрибут, а firstChild возвращает текстовый узел, элемент, инструкцию обработки или комментарий.

Что вы видите, это обычный способ печати объекта на Perl: он печатает свой класс и адрес. Ваша версия XML::LibXML кажется немного античной, последние версии overload строкой и код создает фактический текстовый узел.

#!/usr/bin/perl 
use warnings; 
use strict; 

use XML::LibXML; 

my $doc = 'XML::LibXML'->load_xml(string => << '__XML__'); 
<root> 
    <OBJECT name="o1">hello</OBJECT> 
</root> 
__XML__ 

my @objects = $doc->getElementsByTagName('OBJECT'); 

for my $object (@objects) { 
    print 'OBJECT = ', $object->firstChild, "\n"; 
} 

Выход:

OBJECT = hello 

В старых версиях, одна необходимо вызвать nodeValue или data метод.

print 'OBJECT = ', $object->firstChild->data, "\n"; 
Смежные вопросы