Я использовал XML::XPath для разбора xml-файла и не столкнулся с проблемой. По нескольким причинам (не поддерживается (?), медленно, см., например, здесь) Я пытаюсь использовать XML::LibXML, но безуспешно. Проблема видимо в корне xml-файла. Следующий код работает:
use strict;
use warnings;
use XML::LibXML;
my $prsr = XML::LibXML->new();
$prsr->keep_blanks(0);
my $xp = $prsr->parse_fh(\*DATA);
my @node_article = $xp->findnodes('/ARTICLE/*');
foreach my $node (@node_article) {
print "$node\n\n";
}
__DATA__
<ARTICLE xmlns:xsd="http://whatever" xmlns:xsi="http://whatever">
<EVENT name="cat1" />
<EVENT name="cat2" />
<EVENT name="cat3" />
<EVENT name="cat4" />
<EVENT name="cat5" />
</ARTICLE>
Но если корень содержит пространство имен по умолчанию xmlns="http://whatever", приведенный выше код не работает (нет вывода на терминал).
__DATA__
<ARTICLE xmlns:xsd="http://whatever" xmlns:xsi="http://whatever" xmlns="http://whatever">
<EVENT name="cat1" />
<EVENT name="cat2" />
<EVENT name="cat3" />
<EVENT name="cat4" />
<EVENT name="cat5" />
</ARTICLE>
Одним из решений может быть удаление (вручную) пространства имен, но я хочу избежать этого, поскольку исходный файл будет загружаться и импортироваться периодически. Итак, у меня есть два вопроса:
- Почему пространство имен вызывает проблему при использовании XML::LibXML, но не при использовании XML::XPATH
- Как решить эту проблему с помощью XML::LibXML?
Спасибо за помощь.