如何解析xml文件
我正在尝试解析一个XML文件。我从这里下载数据 我使用这个代码,但我得到了错误如何解析xml文件,xml,perl,Xml,Perl,我正在尝试解析一个XML文件。我从这里下载数据 我使用这个代码,但我得到了错误 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'}->{'inter
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";
}
我把文件放在桌面(mac)的一个文件夹中,然后打开终端,像perl myfile.pl
这就是我得到的错误
在@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/5.16.0/lib/site_perl/5.16.0/Users/admin/perl5.16.0/perl5.0/lib/5.16.0)在myfile.pl第3行。
BEGIN失败--编译在myfile.pl第3行中止
在安装twig之后,现在我得到了这个错误
Use of uninitialized value $MIPS_file in string at myfile.pl line 7.
Can't locate object method "XMLin" via package "XML::Twig" at myfile.pl line 7.
Simple不是标准Perl安装的一部分。如果你想使用它,那么你需要安装它。提供了一个很好的概述如何做到这一点 但是,您应该阅读以下内容: 不鼓励在新代码中使用此模块。还提供了其他模块,它们提供了更直观和一致的接口。特别是,强烈建议使用,这是一个很好的选择 我强烈建议您放弃使用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
行。您没有更改任何实际代码。Simple和Twig是完全不同的库。它们的工作方式完全不同。Twig没有XMLIn()
方法。您需要阅读XML::Twig的文档,并更改代码以使用此模块提供的各种功能。XML::Simple不是标准Perl安装的一部分。如果你想使用它,那么你需要安装它。提供了一个很好的概述如何做到这一点
但是,您应该阅读以下内容:
不鼓励在新代码中使用此模块。还提供了其他模块,它们提供了更直观和一致的接口。特别是,强烈建议使用,这是一个很好的选择
我强烈建议您放弃使用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
行。您没有更改任何实际代码。Simple和Twig是完全不同的库。它们的工作方式完全不同。Twig没有XMLIn()
方法。您需要阅读XML::Twig的文档,并更改代码以使用此模块提供的各种功能。如果不知道您正在下载哪个URL,我无法给出确切的答案
但是,一个非常粗略的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(至少,不是很容易)如果不确切知道您正在下载哪个URL,我无法给您一个确切的答案
但是,一个非常粗略的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(至少,不是很容易)错误是什么?您必须从CPA安装XML::Simple
,或者更好,不要使用XML::Twig
或XML::LibXML
。您是在Windows还是Unix上?你使用的具体文件是什么?(URL)。cpan安装XML::Twig
或查看软件包管理器中的。这可能是相关的:错误是什么?您必须从CPANOr更好地安装XML::Simple
,不要使用XML::Twig
或XML::LibXML
。您使用的是Windows还是Uni