我需要解析xml file并在perl monks网站上找到这个代码,我无法理解代码,我需要的是访问哈希数组元素。
use Data::Dumper;
use XML::Rules;
my $parser = XML::Rules->new(
stripspaces => 7,
rules => {
substrate => sub { 'substrate' => $_[1]->{id}},
product => sub { '@products' => $_[1]->{id}},
reaction => sub {
my %reactions;
foreach (split / /, $_[1]->{name}) {
$reactions{$_} = { substrate => $_[1]->{substrate}, products => $_[1]->{products}};
}
return '%reactions' => \%reactions;
},
graphics => '',
entry => sub {
my @reactions = split ' ', (delete $_[1]->{reaction});
$_[1]->{reactions} = \@reactions if @reactions;
return '%entries' => {$_[1]->{id} => $_[1]}
},
pathway => 'pass'
});
print Dumper ($parser->parsefile('ko00010.xml'));
答案 0 :(得分:2)
您很可能不希望将大型XML文件转换为Perl数据结构。这很容易,但处理数据的方式非常愚蠢(XML不能很好地映射到现代动态语言的数据结构,反之亦然):
use XML::Simple qw(XMLin);
use File::Slurp qw(read_file);
use Data::Dumper qw(Dumper);
print Dumper XMLin scalar(read_file 'kegg.xml'),
KeyAttr => undef, ForceArray => 1, StrictMode => 1;
相反,学习XPath并访问您实际需要的元素:
use XML::LibXML qw();
my $xml = XML::LibXML->load_xml(location => 'kegg.xml');
for ($xml->findnodes('//entry[@name="cpd:C00103"]')) {
print $_->getAttribute('link');
}
答案 1 :(得分:-1)
正确...因此您不希望将大型XML文件转换为Perl数据结构,因此您可以使用从整个文件构建自己的数据结构的库,然后使用另一种语言搜索该混乱。那是多么愚蠢?
如果文件确实很大(原始海报没有说明),则需要部分处理XML。虽然可以使用SAX(如果你碰巧学习SAX而被迫编程,比如Java和XML :: LibXML :: SAX,XML :: SAX,XML :: SAX :: Base,XML的文档) ::几个::更多:: To :: Study,...对你有任何意义),我建议忽略“官方”方式并使用XML :: Twig或XML :: Rules。
第一个允许您指定包含您感兴趣的块的标记,并为您提供易于吞咽的XML(如果您愿意,可以支持XPath)并允许您将这些块丢弃你很快就完成了它们。
后者允许您指定要忽略的标记,要构建的其他数据结构,解析包含其内容的特定标记后要运行的代码等等。这样您就可以构建专门的,修剪后的数据在没有将整个文档存储在内存中的情况下构建XML,或者从XML的部分内容构建专门的,精简的数据结构,并在这些部分完成后立即处理它们。
如果您不关心内存占用并且只想从XML中获取一些内容,那么LibXML和XPath是正确的方法。另一方面,如果您需要大部分数据,您可能会更快地找到XML :: Rules。您进行了设置,它会将XML按摩到一个易于使用的结构中,甚至可以在构建数据结构时计算或获取数据。
如果XML的六个是/成为问题,那么你应该考虑切换,而不是抛弃窗外的所有内容并一直向下到SAX事件和处理程序中的副作用。 XML :: LibXML到XML :: Twig并使用相当少的代码更改来处理块。或者,如果您使用XML :: Rules构建数据结构,请更改一两条规则,以便它处理数据而不是传递它们。