2015-08-28 4 views
1

Мне нужно получить значение из этого xml - http://pastebin.com/wkh7trd4. Вот мой код, но не возвращает ничего:Perl: получить значение из XML

my $xml = XML::LibXML->new('clean_namespaces' => 1)->parse_file("$tmp_dir/xml/$xml_file_name"); 
my $xc = XML::LibXML::XPathContext->new($xml); 
my $val = $xc->findvalue('/ns2:export/ns2:bankGuarantee/docPublishDate'); 
print $val; 
+0

Это может быть исключение, обернуть его в eval {} и dump $ @, если оно существует – steve

+0

было бы интересно увидеть ответ на этот вопрос, который объясняет проблему, поскольку из вашего кода он выглядит хорошо. –

ответ

1

Похоже, что это связано с пространством имен по умолчанию. Не знаете, как работает, но XPath @miller казалось ответить на свой вопрос здесь: XML::LibXML, namespaces and findvalue

Вы можете попробовать, ниже которого следует надеяться решить вашу проблему

use strict; 
use warnings; 
use XML::LibXML; 

open(my $xml_file, '<', "xml_to_parse.xml"); 
my $xml = new XML::LibXML->load_xml(IO => $xml_file); 
print $xml->findvalue('/ns2:export/ns2:bankGuarantee/*[local-name()="docPublishDate"]'), "\n"; 
0

библиотеки часто бросать исключения в случае неудачи, если вы не поймать их, они могли не тихо.

попробовать:

use strict; 
use warnings FATAL => 'all'; 

eval 
{ 
    my $xml = XML::LibXML->new('clean_namespaces' => 1)->parse_file("$tmp_dir/xml/$xml_file_name"); 
    my $xc = XML::LibXML::XPathContext->new($xml); 
    my $val = $xc->findvalue('/ns2:export/ns2:bankGuarantee/docPublishDate'); 
    print $val; 
} 
if([email protected]) 
{ 
    print "ERROR: " . [email protected]; 
} 

Если один не удается, он должен дать вам ошибку.

+0

Это не дает никаких ошибок. – Artem

0

Просто создавая XML::LibXML:XPathContext объект не будет никакой разницы , вам также необходимо зарегистрировать все пространства имен, которые вы хотите использовать в выражениях XPath. В этом случае вы использовали ns2 пространство имен без регистрации каких-либо имен на всех

Ваш код должен выглядеть как этот

my $xml = XML::LibXML->new->parse_file("$tmp_dir/xml/$xml_file_name"); 

my $xc = XML::LibXML::XPathContext->new($xml); 
$xc->RegisterNs(ns2 => 'http://example.com/ns2/uri/address'); 

my $val = $xc->findvalue('/ns2:export/ns2:bankGuarantee/docPublishDate'); 
print $val; 

Обратите внимание, что URI регистрации должен совпадать с тем, в

xmlns:ns2="http://example.com/ns2/uri/address" 

атрибут в данных

Я интересно, если опция clean_namespaces парсер ваша попытка исправить это? clean_namespaces удалит только резервные пространства имен, то есть те, которые не используются нигде в документе XML. Это мало смысла в этом, так как у вас мало шансов столкнуться с пространствами имен, а сохраненное время и память будут незначительными

Смежные вопросы