使用xml::Rules perl解析xml文件
我需要分析,我在perl monks网站上找到了这段代码,我无法理解代码,我需要的是访问数组元素的散列使用xml::Rules perl解析xml文件,xml,perl,Xml,Perl,我需要分析,我在perl monks网站上找到了这段代码,我无法理解代码,我需要的是访问数组元素的散列 use Data::Dumper; use XML::Rules; my $parser = XML::Rules->new( stripspaces => 7, rules => { substrate => sub { 'substrate' => $_[1]->{id}}, product =>
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'));
您很可能不希望将大型XML文件转换为Perl数据结构。这非常简单,但却是一种非常愚蠢的数据处理方式(XML不能很好地映射到现代动态语言的数据结构,反之亦然): 相反,学习XPath并访问实际需要的元素:
use XML::LibXML qw();
my $xml = XML::LibXML->load_xml(location => 'kegg.xml');
for ($xml->findnodes('//entry[@name="cpd:C00103"]')) {
print $_->getAttribute('link');
}
对。。。因此,您不希望将大型XML文件转换为Perl数据结构,因此您可以使用一个库,该库从整个文件中构建自己的数据结构,然后使用另一种语言在混乱中进行搜索。这有多蠢 如果文件真的很大(原始海报上没有说),则需要分部分处理XML。虽然可以使用SAX(如果您在被迫使用Java和XML::LibXML::SAX、XML::SAX、XML::SAX、XML::SAX、XML::SAX::Base、XML::Move::More::to::Study等文档编程时碰巧学习过SAX,那么我建议您忽略“官方”方式,使用XML::Twig或XML::Rules 第一种方法允许您指定您感兴趣的块所包含的标记,并以易于接受的方式提供XML(如果您愿意,可以支持XPath),并允许您在处理完这些块后立即丢弃它们 后者允许您指定要忽略的标记、要从其他标记中构建的数据结构、解析特定标记(包括其内容)后要运行的代码等。因此,您可以从XML中构建专门的、精简的数据结构,而无需将整个文档存储在内存中,或者构建专门的,从XML的各个部分中精简数据结构,并在这些部分完成后立即进行处理 如果您不关心内存占用,只想从XML中提取一些信息,那么LibXML和XPath是正确的选择。另一方面,如果您需要大部分数据,您可能会发现XML::Rules更快。您设置它,它将把XML转换成一个易于使用的结构,甚至可以在构建数据结构时计算或获取数据
如果XML的十六分之一成为问题,那么,不要把所有的东西扔出窗外,一直到SAX事件和处理程序中的副作用,你应该考虑从XML:LIbXML转换到XML::TIGG,并对代码进行相当小的更改来处理块。或者,如果您使用XML::Rules构建数据结构,请更改一两条规则,以便它处理数据而不是传递数据。
谢谢您的评论。现在,我已经进行了一点,但存储在内部节点处理中use XML::LibXML qw();
my $xml = XML::LibXML->load_xml(location => 'kegg.xml');
for ($xml->findnodes('//entry[@name="cpd:C00103"]')) {
print $_->getAttribute('link');
}