Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用xml::Rules perl解析xml文件_Xml_Perl - Fatal编程技术网

使用xml::Rules perl解析xml文件

使用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 =>

我需要分析,我在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'));  

您很可能不希望将大型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');
}