我该如何解析xml文件

时间:2016-11-15 10:41:14

标签: xml perl

我正在尝试解析XML文件。我从这里下载数据 http://mips.helmholtz-muenchen.de/proj/ppi/

我使用此代码但是我收到错误

my_view

我把文件放在桌面上的文件夹(mac)然后我打开终端,我调用了像use strict; use warnings; use XML::Twig; my $MIPS_file = $ARGV[0]; my $xml = XML::Twig->new(); my $data = $xml->XMLin("$MIPS_file"); my $intList = $data->{'entry'}->{'interactionList'}->{'interaction'}; foreach my $int (@{$intList}) { my $experiment_type = $int->{'experimentList'}->{'experimentDescription'}->{'interactionDetection'}->{'names'}->{'shortLabel'}; my $partList = $int->{'participantList'}->{'proteinParticipant'}; my ($p1,$p2); foreach my $protPart(@{$partList}) { if ($protPart->{'proteinInteractor'}->{'organism'}->{'ncbiTaxId'} eq "9606") { # select human proteins if (!$p1) { $p1 = $protPart->{'proteinInteractor'}->{'xref'}->{'primaryRef'}->{'id'}; } else { $p2 = $protPart->{'proteinInteractor'}->{'xref'}->{'primaryRef'}->{'id'}; } } } print "$p1\$p2\n"; }

这样的程序

这是我得到的错误

  

无法在@INC中找到XML / Simple.pm(@INC包含:/Users/admin/perl5/perlbrew/perls/perl-5.16.0/lib/site_perl/5.16.0/darwin-2level / Users /admin/perl5/perlbrew/perls/perl-5.16.0/lib/site_perl/5.16.0/Users/admin/perl5/perlbrew/perls/perl-5.16.0/lib/5.16.0/darwin-2level / Users /admin/perl5/perlbrew/perls/perl-5.16.0/lib/5.16.0。)at myfile.pl第3行。   BEGIN失败 - 编译在myfile.pl第3行中止。

安装树枝后,现在我收到此错误

perl myfile.pl

2 个答案:

答案 0 :(得分:1)

XML :: Simple不是标准Perl安装的一部分。如果要使用它,则需要安装它。 This answer很好地概述了如何做到这一点。

但是,您应该阅读documentation for XML::Simple,其中包含:

  

不鼓励在新代码中使用此模块。其他模块可用,提供更直接和一致的接口。特别强调XML::LibXMLXML::Twig是一个很好的选择。

我强烈建议您放弃使用XML :: Simple,而选择上述其他模块之一。

更新:您现在已经安装了XML :: Twig,并更新了您的问题以添加您收到的错误消息。

  

在myfile.pl第7行的字符串中使用未初始化的值$ MIPS_file。

     

无法通过myfile.pl第7行的“XML :: Twig”包找到对象方法“XMLin”。

第7行似乎是这样的:

my $data = $xml->XMLin("$MIPS_file");

变量$MIPS_file在此行的前几行给出了一个值:

my $MIPS_file = $ARGV[0];

@ARGV数组是您可以访问传递给程序的任何命令行参数的地方。 $MIPS_file包含undef的事实强烈暗示不会将任何参数传递给您的程序。你需要像这样运行它:

myfile.pl name_of_your_xml_file.xml

第二个错误更有趣。

  

无法通过myfile.pl第7行的“XML :: Twig”包找到对象方法“XMLin”。

您已使用XML :: Simple转换为使用XML :: Twig。但要做到这一点,您只更改了程序中的use行。您没有更改任何实际代码。 XML :: Simple和XML :: Twig是完全不同的库。它们根本不会以相同的方式工作。 XML :: Twig没有XMLIn()方法。您需要阅读XML :: Twig的文档并更改代码以使用此模块提供的各种功能。

答案 1 :(得分:1)

如果不确切知道您正在下载哪个网址,我无法给您一个坚定的答案。

然而,一个非常粗略的XML :: Twig示例可能会执行您正在寻找的内容:

#!/usr/bin/env perl
use strict;
use warnings;

use XML::Twig;

my $MIPS_file = $ARGV[0];
my $xml = XML::Twig->new();
$xml -> parsefile ( $MIPS_file );

#assuming ncbTaxId is an attribute - I don't know, this is part of the problem with XML::Simple
foreach my $element ( $xml -> get_xpath ( '//proteinInteractor/organism[@ncbiTaxId="9606"]/..' ) ) {
    $element -> print; #debugging;
    #assuming 'id' is an attrbute of 'primaryRef' subelement. 
    print $element -> get_xpath('.//primaryRef',0) -> att('id'); 
}

注意 - 根据您的XML :: Simple代码,这是一个猜测,而不是引用源XML(因为我不知道您正在使用哪个XML源)。这是XML::Simple问题的一部分 - 它不能完全代表XML(至少,不是很容易)