Я использую XML::LibXML::Reader для анализа большого документа и столкнулся с проблемой, из-за которой атрибут xmlns приводит к сбою findnodes(). Я исправил это, добавив регулярное выражение для удаления атрибута xmls, но мне было интересно, есть ли более элегантное решение без регулярных выражений. Если вы удалите строку регулярного выражения ($xml =~ s{xmlns...), вы увидите, что фраза «Loc = $loc» не дает результатов.
Вот код:
use strict;
use warnings;
use feature qw( say );
use XML::LibXML::Reader qw( XML_READER_TYPE_ELEMENT );
my $xml = <<'__EOI__';
<url xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
<loc>http://example.com</loc>
<lastmod>2018-10-19</lastmod>
</url>
__EOI__
$xml =~ s{xmlns="http://www.sitemaps.org/schemas/sitemap/0.9"}{};
my $reader = XML::LibXML::Reader->new( string => $xml);
while ( $reader->read ) {
next unless $reader->nodeType == XML_READER_TYPE_ELEMENT;
next unless $reader->name eq 'url';
my $xml = $reader->readOuterXml;
my $doc = XML::LibXML->load_xml(string => $xml);
say "Doc = $doc";
my ($loc) = $doc->findnodes('//loc');
say "Loc = $loc";
}