Sto cercando di analizzare un file XML. Scarico i dati da qui http://mips.helmholtz-muenchen.de/proj/ppi/
e io uso questo codice ma ottengo errore
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$p2n";
}
Metto il file su una cartella in desktop (mac) Poi apro il terminale e invoco il programma come perl myfile.pl
Questo è l'errore che ottengo
Impossibile localizzare XML / Semplice.pm in @INC (@INC contiene: /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.) Alla riga myfile.pl 3. BEGIN fallito - la compilazione è fallita su myfile.pl line 3.
Dopo aver installato twig, ora ottengo questo errore
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.
risposte:
1 per risposta № 1XML :: Simple non fa parte dell'installazione standard di Perl. Se si desidera utilizzarlo, è necessario installarlo. Questa risposta offre una buona panoramica di come farlo.
Tuttavia, dovresti leggere il documentazione per XML :: Semplice, che dice:
L'uso di questo modulo nel nuovo codice è sconsigliato. Sono disponibili altri moduli che forniscono interfacce più semplici e coerenti. In particolare, XML :: LibXML è altamente raccomandato e XML :: Twig è un'alternativa eccellente.
Consiglio vivamente di abbandonare l'utilizzo di XML :: Simple in favore di uno degli altri moduli sopra menzionati.
Aggiornare: Hai ora installato XML :: Twig e hai aggiornato la tua domanda per aggiungere i messaggi di errore che stai ricevendo.
Utilizzo del valore non inizializzato $ MIPS_file nella stringa in myfile.pl line 7.
Impossibile trovare il metodo object "XMLin" tramite il pacchetto "XML :: Twig" in myfile.pl line 7.
La linea 7 sembra essere questa:
my $data = $xml->XMLin("$MIPS_file");
La variabile $MIPS_file
viene assegnato un valore poche righe in precedenza in questa riga:
my $MIPS_file = $ARGV[0];
Il @ARGV
array è dove puoi accedere a qualsiasi argomento della riga di comando passato al tuo programma. Il fatto che $MIPS_file
contiene undef
implica fortemente che non passa alcun argomento al tuo programma. Devi eseguirlo in questo modo:
myfile.pl name_of_your_xml_file.xml
Il secondo errore è più interessante.
Impossibile trovare il metodo object "XMLin" tramite il pacchetto "XML :: Twig" in myfile.pl line 7.
Sei passato dall'uso di XML :: Simple all'utilizzo di XML :: Twig. Ma per farlo hai solo cambiato il use
linea nel tuo programma. Non hai cambiato nessuno dei codici effettivi XML :: Simple e XML :: Twig sono librerie completamente diverse e non funzionano affatto allo stesso modo. XML :: Twig non ha un XMLIn()
metodo. Sarà necessario leggere la documentazione per XML :: Twig e modificare il codice per utilizzare le varie funzioni fornite da questo modulo.
1 per risposta № 2
Senza sapere esattamente quale URL stai scaricando, non posso darti una risposta decisa.
Tuttavia, un esempio XML :: Twig molto approssimativo potrebbe fai quello che stai cercando è:
#!/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");
}
Nota: questo è un po 'un'ipotesi basata sul tuo codice XML :: Simple, piuttosto che fare riferimento all'XML sorgente (perché non so quale sorgente XML stai usando). Questo è parte del problema con XML::Simple
- non può rappresentare completamente XML (almeno, non molto facilmente)