Schrift
[thread]8083[/thread]

XML fehler

Leser: 1


<< |< 1 2 >| >> 19 Einträge, 2 Seiten
paidopoieo
 2006-06-14 21:35
#67368 #67368
User since
2005-12-02
96 Artikel
BenutzerIn
[default_avatar]
hallo,
Ich bekomme folgende Fehlermeldung beim parsen eines kleinen xml files mit XML::Simple

Code: (dl )
no element found at line 1, column 0, byte 0 at /usr/local/lib/perl5/site_perl/5.8.8/i686-linux/XML/Parser.pm line 187


nachdem ich jede menge gegoogelt habe, und alles gemacht habe, was die gesat haben, wie z.b expat parser installieren, und xml::dom, xml::generator updaten...bekomm ich noch immer die fehlermeldung....

script:

Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
#!/usr/local/bin/perl -w

#use strict;
#use warnings;
use DBI;
use Net::MySQL;
use HTTP::Request::Common;
use LWP::UserAgent;
use CGI qw(header -no_debug);
use XML::Simple;

#==============================database connection================================================


#=============================end database connection==================================================


$mysql->query(qq{SELECT accession_code FROM protein});

my $record_set = $mysql->create_record_iterator;

while (my $record = $record_set->each) {
print "Accession ID: $record->[0] \n";

#For retrieving data from a url post in perl, we will use the LWP module "get" function

use LWP::Simple; #supports the "get" function

$baseurl="http://eutils.ncbi.nlm.nih.gov/entrez/eutils/";
$eutil="esearch.fcgi?";
$parameters="db=protein&term=$record->[0]&retmode=xml";
$url=$baseurl.$eutil.$parameters;

$raw=get($url);

open(FILE, ">$record->[0].xml");

print FILE $raw;

# create object
my $xml = new XML::Simple or die "new failed";

# read XML file
my $data = $xml->XMLin("$record->[0].xml") or die "parse failed";

# access XML data
print "$data->{Id} \n";

close FILE;
unlink("$record->[0].xml");
}


die datenbankverbindung funktioniert einwandfrei, sowie das select statement, das abrufen der xml daten und speichern im file funktioniert auch, nur eben das parsen nicht, ich brauche von dem xml file nur den inhalt des id tags, sonst nichts....

xml file:

Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
<?xml version="1.0"?>
<!DOCTYPE eSearchResult PUBLIC "-//NLM//DTD eSearchResult, 11 May 2002//EN" "http://www.ncbi.nlm.nih.gov/entrez/query/DTD/eSearch_020511.dtd">
<eSearchResult>
<Count>1</Count>
<RetMax>1</RetMax>
<RetStart>0</RetStart>
<IdList>
<Id>29427659</Id>
</IdList>
<TranslationSet>
</TranslationSet>
<TranslationStack>
<TermSet>
<Term>140U_DROME[All Fields]</Term>
<Field>All Fields</Field>
<Count>1</Count>
<Explode>Y</Explode>
</TermSet>
<OP>GROUP</OP>
</TranslationStack>
</eSearchResult>


danke fuer die hilfe
vayu
 2006-06-14 22:15
#67369 #67369
User since
2005-01-13
782 Artikel
BenutzerIn
[default_avatar]
kleiner tipp, benutz nicht XML::Simple

benutz CPAN:XML::Twig

damit kannst du sehr leicht per xpath-ausdruck nur den gesuchten wert aus dem file holen, ohne dass du vorher das komplette file einlesen musst. Wie das geht findest du hier:

XML Twig Doku\n\n

<!--EDIT|vayu|1150308952-->
paidopoieo
 2006-06-15 02:28
#67370 #67370
User since
2005-12-02
96 Artikel
BenutzerIn
[default_avatar]
hi,
danke fuer den tipp....
hab das auch jetzt umgeaendert, jedoch will es mir den text des idtags nicht ausgeben, will den text haben und dann einfach in einer variablen speichern ....

Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
#!/usr/local/bin/perl -w

#use strict;
#use warnings;
use DBI;
use Net::MySQL;
use HTTP::Request::Common;
use LWP::UserAgent;
use CGI qw(header -no_debug);
use XML::Twig;

#==============================database connection================================================


#=============================end database connection==================================================


$mysql->query(qq{SELECT accession_code FROM protein});

my $record_set = $mysql->create_record_iterator;

while (my $record = $record_set->each) {
print "Accession ID: $record->[0] \n";

#For retrieving data from a url post in perl, we will use the LWP module "get" function

use LWP::Simple; #supports the "get" function

$baseurl="http://eutils.ncbi.nlm.nih.gov/entrez/eutils/";
$eutil="esearch.fcgi?";
$parameters="db=protein&term=$record->[0]&retmode=xml";
$url=$baseurl.$eutil.$parameters;

$raw=get($url);

open(FILE, ">$record->[0]");
print FILE $raw;
close FILE;

$xml_file = $record->[0];

my $twig= XML::Twig->new(

TwigHandlers => {

"/eSearchResult/IdList/Id" => \&id_Tag

}
);


#actually parse the file
$twig->parsefile($xml_file) or die "cannot parse [$xml_file]: $!";



###########################################
sub id_Tag {
###########################################
my($t, $idTag)= @_;

print $idTag->text(), "\n";

# Release memory of processed tree up to here
$t->purge();
}

}
\n\n

<!--EDIT|paidopoieo|1150324154-->
vayu
 2006-06-15 02:36
#67371 #67371
User since
2005-01-13
782 Artikel
BenutzerIn
[default_avatar]
lass mal den ersten slash in dem xpath ausdruck weg.

Code: (dl )
1
2
3
4
5
 TwigHandlers => {

"eSearchResult/IdList/Id" => \&id_Tag

}
vayu
 2006-06-15 02:41
#67372 #67372
User since
2005-01-13
782 Artikel
BenutzerIn
[default_avatar]
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#!/usr/bin/perl

use strict;
use warnings;
use XML::Twig;

my $twig= XML::Twig->new(
TwigHandlers => {
"eSearchResult/IdList/Id" => \&id_Tag
}
);

$twig->parsefile("bla.xml") or die "cannot parse : $!";

sub id_Tag {
my($t, $idTag)= @_;
print $idTag->text(), "\n";
# Release memory of processed tree up to here
$t->purge();
}


funktioniert bei mir und printed mir

D:\Temp\Neuer Ordner>perl bla.pl
29427659

aus\n\n

<!--EDIT|vayu|1150325081-->
paidopoieo
 2006-06-15 03:23
#67373 #67373
User since
2005-12-02
96 Artikel
BenutzerIn
[default_avatar]
hi vayu,
danke, genau das wars...
funktioniert sofern wunderbar, nur bricht er mir nach einigen geparsten xml ab und beendet das programm.....
kann es sein das der parser so reagiert, wenn der id tag leer ist....

mfg
paidopoieo
 2006-06-15 03:39
#67374 #67374
User since
2005-12-02
96 Artikel
BenutzerIn
[default_avatar]
ok, hab jetzt rausgefunden das ich xml files zurueckbekommen kann, wo kein id tag vorkommt.....
paidopoieo
 2006-06-15 04:05
#67375 #67375
User since
2005-12-02
96 Artikel
BenutzerIn
[default_avatar]
ok,
wie kann ich am besten diese fehlermeldung abfangen, sodass er mir einfach weiterparst und icht abbricht....
renee
 2006-06-15 11:42
#67376 #67376
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Welche Fehlermeldung?? Kannst Du bitte den Code posten, eine Beispiel-XML-Datei und die Fehlermeldung?
OTRS-Erweiterungen (http://feature-addons.de/)
Frankfurt Perlmongers (http://frankfurt.pm/)
--

Unterlagen OTRS-Workshop 2012: http://otrs.perl-services.de/workshop.html
Perl-Entwicklung: http://perl-services.de/
vayu
 2006-06-15 13:39
#67377 #67377
User since
2005-01-13
782 Artikel
BenutzerIn
[default_avatar]
also vom prinzip sollte Twig nicht abbrechen.

wenn es den Pfad nicht gibt, wird die parse funktion einfach nicht aufgerufen.

paste mal die fehlermeldund bitte

und falls das IdTag zwar vorhanden ist, aber leer, dann verändere halt deine sub

Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
###########################################
sub id_Tag {
###########################################
my($t, $idTag)= @_;
unless($idTag->text()) {
print "ID-tag leer\n";
}
print $idTag->text(), "\n";

# Release memory of processed tree up to here
$t->purge();
}
\n\n

<!--EDIT|vayu|1150364480-->
<< |< 1 2 >| >> 19 Einträge, 2 Seiten



View all threads created 2006-06-14 21:35.