Просто создавая 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. Это мало смысла в этом, так как у вас мало шансов столкнуться с пространствами имен, а сохраненное время и память будут незначительными
Это может быть исключение, обернуть его в eval {} и dump $ @, если оно существует – steve
было бы интересно увидеть ответ на этот вопрос, который объясняет проблему, поскольку из вашего кода он выглядит хорошо. –