/ / Jak mogę parsować plik xml - xml, perl

jak mogę parsować plik xml - xml, perl

Próbuję przeanalizować plik XML. Pobieram dane stąd http://mips.helmholtz-muenchen.de/proj/ppi/

i używam tego kodu, ale dostaję błąd

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";
}

Umieszczam plik w folderze na pulpicie (mac) Następnie otwieram terminal i wzywam program jak perl myfile.pl

To jest błąd, który otrzymuję

Nie można zlokalizować XML / Simple.pm w @INC (@INC zawiera: /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.) Na linii myfile.pl 3. BEGIN nie powiodło się - kompilacja przerwana na linii myfile.pl 3.

Po zainstalowaniu gałązki, teraz pojawia się ten błąd

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.

Odpowiedzi:

1 dla odpowiedzi № 1

XML :: Simple nie jest częścią standardowej instalacji Perla. Jeśli chcesz go użyć, musisz go zainstalować. Ta odpowiedź daje dobry przegląd tego, jak to zrobić.

Jednak powinieneś przeczytać dokumentacja dla XML :: Simple, który mówi:

Użycie tego modułu w nowym kodzie jest odradzane. Dostępne są inne moduły, które zapewniają bardziej proste i spójne interfejsy. W szczególności, XML :: LibXML jest wysoce zalecane i XML :: Twig jest doskonałą alternatywą.

Zdecydowanie odradzam korzystanie z XML :: Simple na rzecz jednego z pozostałych wymienionych powyżej modułów.

Aktualizacja: Zainstalowałeś teraz XML :: Twig i zaktualizowałeś swoje pytanie, aby dodać otrzymywane komunikaty o błędach.

Użycie niezainicjowanej wartości $ MIPS_file w ciągu znaków na stronie myfile.pl wiersz 7.

Nie można zlokalizować metody obiektowej "XMLin" za pomocą pakietu "XML :: Twig" w wierszu 7 myfile.pl.

Linia 7 wydaje się być taka:

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

Zmienna $MIPS_file otrzymuje wartość kilka linii wcześniej w tym wierszu:

my $MIPS_file = $ARGV[0];

The @ARGV array to miejsce, w którym można uzyskać dostęp do wszystkich argumentów wiersza poleceń przekazanych do programu. Fakt, że $MIPS_file zawiera undef zdecydowanie sugeruje, że nie przekazuje żadnych argumentów do twojego programu. Musisz uruchomić go tak:

myfile.pl name_of_your_xml_file.xml

Drugi błąd jest bardziej interesujący.

Nie można zlokalizować metody obiektowej "XMLin" za pomocą pakietu "XML :: Twig" w wierszu 7 myfile.pl.

Przestawiłeś z użycia XML :: Simple na XML :: Twig. Ale żeby to zrobić, zmieniłeś tylko use linia w twoim programie. Nie zmieniłeś żadnego z rzeczywistych kodów XML :: Simple i XML :: Twig to zupełnie inne biblioteki, które nie działają w taki sam sposób. XML :: Twig nie ma XMLIn() metoda. Będziesz musiał przeczytać dokumentację XML :: Twig i zmienić swój kod, aby korzystać z różnych funkcji, które zapewnia ten moduł.


1 dla odpowiedzi nr 2

Nie wiedząc dokładnie, który adres URL pobierasz, nie mogę dać ci jednoznacznej odpowiedzi.

Jednak bardzo szorstki przykład XML :: Twig moc rób to, czego szukasz:

#!/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");
}

Uwaga - jest to raczej domysły oparte na twoim kodzie XML :: Simple, niż na referencyjnym źródłowym XML (ponieważ nie wiem, którego źródła XML używasz). To jest część problemu z XML::Simple - nie może całkowicie reprezentować XML (przynajmniej nie bardzo łatwo)