Thread xml tiefer auslesen (5 answers)
Opened by jan99 at 2015-08-14 07:52

jan99
 2015-08-14 07:52
#181792 #181792
User since
2008-09-18
439 Artikel
BenutzerIn
[default_avatar]
Moin !

ich habe mal ein Skript gesucht um einfach XML-Daten auslesen zu können:

Code (perl): (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
#!/usr/bin/perl 
# Quelle: http://linux.ittoolbox.com/groups/technical-functional/linuxadmin-l/xml-to-csv-by-perl-script-4395356
 use warnings; 
 use strict; 
 use XML::XPath; 

 # Parameter 1: Dateiname der XML-Datei OHNE Suffix
 # Ausgabe-Datei wird automatisch als CSV auf Basis von Parameter 1 generiert
 # bei findnodes ist der Knoten anzugeben ab welchem die Daten ausgelesen werden sollen.
 # das Ergebnis wird in die Datei und die Commandozeile geschrieben
 
 my $xml_file = $ARGV[0].".cui";
 my $csv_file = $ARGV[0].".txt";

 open(my $fh, '>>', $csv_file) || die "Error to open cui-file:$!";
 
 # Musterdaten aus dem DATA-Abschnitt
 #my($xp) = XML::XPath->new( join('', <DATA>) ); 
 my $xp = XML::XPath->new(filename=>$xml_file);

 # hier wird der Punkt der Ebenen über den gesuchten Daten angegeben
 my(@records) = $xp->findnodes( '/MenuGroup/MacroGroup/MenuMacro' ); 
 my($firstTime) = 0; 

 foreach my $record ( @records ) { 
 my(@fields) = $xp->find( './child::*', $record )->get_nodelist(); 
 unless ( $firstTime++ ) { 
 print( join( ';', map { $_->getName() } @fields ), "\n"); 
 print $fh ( join( ';', map { $_->getName() } @fields ), "\n");

 } 
 print( join( ';', map { $_->string_value() } @fields ), "\n"); 
 print $fh (join( ';', map { $_->getName() } @fields ), "\n");

 } 
close($fh);


Damit habe ich bisher eine flache Struktur ausgelesen. Nun soll folgende Struktur ausgelesen werden:

Quote
<MenuGroupxmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:xsd="http://www.w3.org/2001/XMLSchema"Name="EBL_WERKZEUG_1"DisplayName="EBL_WERKZEUG_1">
<MacroGroup Name="EBL_Werkzeug_1Macros">
<MenuMacro UID="ID_02">
<Macro type="Any">
<Revision MajorVersion="16" MinorVersion="2" UserVersion="1" />
<ModifiedRev MajorVersion="17" MinorVersion="2" UserVersion="1" />
<Name xlate="true" UID="XLS_0002">Zoom auf Straße und Hausnummer</Name>
<Command>^C^C(C:BJ_TBLOGOUT);-vbarun BJ__POSFIND STR_HSNR EBL_KANAL </Command>
<SmallImage Name="ICBJ0162.BMP" />
<LargeImage Name="ICBJ0162.bmp" />
</Macro>
</MenuMacro>
<MenuMacro UID="ID_03">
<Macro type="Any">
<Revision MajorVersion="16" MinorVersion="2" UserVersion="1" />
<ModifiedRev MajorVersion="18" MinorVersion="0" UserVersion="0" />
<Name xlate="true" UID="XLS_0004">Zoom auf Gemarkung/Flur/Flurstück</Name>
<Command>^C^C(C:BJ_TBLOGOUT);-vbarun BJ__POSFIND GEM_F_FL ALK </Command>
<SmallImage Name="ICBJ0161.bmp" />


Irgendwie bin ich mit dem Thema XML in Perl noch nicht weiter gekommen.

Kann mir einer weiterhelfen?

Gruß Jan
perl-Greenhorn - Win7 64bit / strawberry (ehem. activeperl) - www.OpenStreetMap.de

View full thread xml tiefer auslesen