我正在尝试解析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
答案 0 :(得分:1)
XML :: Simple不是标准Perl安装的一部分。如果要使用它,则需要安装它。 This answer很好地概述了如何做到这一点。
但是,您应该阅读documentation for XML::Simple,其中包含:
不鼓励在新代码中使用此模块。其他模块可用,提供更直接和一致的接口。特别强调XML::LibXML,XML::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(至少,不是很容易)