Danke für den Tipp ptk. Ich habe mich aber jetzt schon in XML::Twig eingelesen und es scheint ein gutes Modul zu sein welches meinen Anforderungen genügt ;D
Leider ist denoch ein kleines Probelm aufgetaucht:
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
...
<Entrezgene_unique-keys>
<Dbtag>
<Dbtag_db>HGNC</Dbtag_db>
<Dbtag_tag>
<Object-id>
<Object-id_id>5</Object-id_id>
</Object-id>
</Dbtag_tag>
</Dbtag>
<Dbtag>
<Dbtag_db>LocusID</Dbtag_db>
<Dbtag_tag>
<Object-id>
<Object-id_id>1</Object-id_id>
</Object-id>
</Dbtag_tag>
</Dbtag>
<Dbtag>
<Dbtag_db>MIM</Dbtag_db>
<Dbtag_tag>
<Object-id>
<Object-id_id>138670</Object-id_id>
</Object-id>
</Dbtag_tag>
</Dbtag>
</Entrezgene_unique-keys>
...
Das ist ein kleiner Ausschnitt aus dem XML Code den ich parsen möchte. Leider ist der Tag <Dbtag>, <Dbtag_db>, <Object-id> und <Object-id_id> nicht unique. D.h. sie kommen auch in anderen Tags weiter oben und unten vor. Mich interessiert aber lediglich die Information, die von <Entrezgene_unique-keys> umklammert wird.
Wie kann ich diese Information herausfischen? Wäre nett wenn ihr mir noch mal helfen könntet.
Ich dachte das Problem wäre einfach mit second_child,... zu lösen, aber anscheinend kann das Modul dieses nicht handeln. Gibt es eine andere Funktion die ich aufrufen kann um Sub-Subelemente zu öffnen?
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
#!/usr/bin/perl -w
use warnings;
use strict;
use DBI;
use XML::Twig; #http://xmltwig.com/xmltwig/tutorial/yapc_twig_s4.html for good references!!!
header();
my $twig = new XML::Twig(
TwigHandlers => #Gene-track element will be called when each player element has been parsed
{
"Entrezgene_unique-keys" => \&dbxref
#"Dbtag_tag" => \&dbxref #funzt nicht, weil es mehere TagElemente diesen Typs gibt
#"Object-id_id" => \&dbxref #funzt nicht, weil es mehere TagElemente diesen Typs gibt
}
);
$twig->parsefile("Homo_sapiens.ags"); #built the twig
sub dbxref {
my ($twig, $dbxref) = @_;
#leider gehen diese Ansätze nicht, da ich nur das 'erste Kind' erfassen kann. Wie kann ich weitere Subelemente aufrufen?
my $id = first_child('Dbtag') #->second_child('Dbtag_db')->text;
my $db = first_child('Dbtag') #->second_child('Dbtag_tag')->third_child('Object-id')->fourth_child('Obejct-id_id')->text;
print "$id\t$db\n";
}