Perl, как разобрать файл XML, xpath - PullRequest
11 голосов
/ 11 марта 2012

Я хочу проанализировать XML-файл, используя Perl .Я смог сделать это с помощью модуля XML :: Simple , но теперь я хочу начать использовать модуль XML :: XPath , поскольку он использует XPath выражения.Из моих ограниченных знаний я думаю, что XPaths облегчит будущий разбор, верно?Вот код Perl, который у меня есть:

use strict;
use warnings;
use XML::XPath;

my $file = "data.xml";
my $path = XML::XPath->new(filename => $file);

my $name = $path->find('/category/event/@name');
print $name."\n";

Мой вопрос: как мне отделить каждый атрибут имени (категория / событие / @ имя ), чтобы я мог выполнять тесты на каждомценность разбираю.В данный момент я просто получаю большую строку, полную проанализированных данных, тогда как мне нужно несколько маленьких строк, которые я могу протестировать.Как я могу это сделать?Спасибо: -)

Ответы [ 2 ]

19 голосов
/ 11 марта 2012

Этот обзор указывает, что XML::XPath не обновлялся с 2003 года, и рекомендует XML::LibXML вместо

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

my $dom = XML::LibXML->new->parse_file('data.xml');
for my $node ($dom->findnodes('/category/event/@name')) {
    say $node->toString;
}

См. XML::LibXML::Parser и XML::LibXML::Node.

7 голосов
/ 11 марта 2012

Метод find возвращает объект XML::XPath::NodeSet, который является коллекцией всех найденных узлов.Я не могу представить, что вы могли бы сделать, чтобы увидеть одну длинную строку со всеми значениями атрибутов.

Получив набор узлов, вы работаете с его содержимым с помощью методов, таких как size, get_nodeи get_nodelist (см. документы, которые я связал выше).get_nodelist вернет список Perl, в данном случае, XML::XPath::Node::Attribute объектов, которые также имеют свои собственные методы.Эта программа должна помочь вам начать

use strict;
use warnings;

use XML::XPath;

my $xp = XML::XPath->new(ioref => \*DATA);

my $names = $xp->find('/category/event/@name');

for my $node ($names->get_nodelist) {
  say $node->getNodeValue;
}


__DATA__
  <category name="a">
    <event name="cat1" />  
    <event name="cat2" />  
    <event name="cat3" />  
    <event name="cat4" />  
    <event name="cat5" />  
  </category>

ВЫХОД

cat1
cat2
cat3
cat4
cat5
...