/ / Come posso analizzare un file xml - xml, perl

come posso analizzare un file xml - xml, perl

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 № 1

XML :: 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)