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

Gast janus
 2015-08-15 07:16
#181793 #181793
Die Struktur ist zyklisch, d.h. dass in der Sequenz eine sich wiederholende Datenstruktur steckt. Die Wiederholung baut auf eine sogenannte Entity, hier gekennzeichnet als MenuMacro/UID.

Darüber steht noch die Gruppe, die jedoch ist für den Zyklus zunächst uninteressant. Schauen wir mal, welche Informationen überhaupt in der Sequenz stecken und welche Datenstruktur uns erwartet. Die ist nämlich gar nicht so kompliziert und alle Andere als tief. Und: Sie muss nicht rekursiv durchlaufen werden, weil sie eben einfach zyklisch ist.

Eine für mich erkennbare Struktur ist ein Hash mit Referenzen:

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
$MacroMenus = {
ID_02 => {
macro_type => 'Any',
rev_major_version => 16,
rev_minor_version => 2,
rev_user_version => 1,
modrev_major_version => 17,
modrev_min_versione => 2,
modrev_user_version => 1,
name_xlate => true,
name_uid => 'XLS_0002',
name_label => 'Zoom auf Straße und Hausnummer',
command => '^C^C(C:BJ_TBLOGOUT);-vbarun BJ__POSFIND STR_HSNR EBL_KANAL ',
small_img => 'ICBJ0162.BMP',
large_img => 'ICBJ0162.BMP',
},
ID_03 => {
macro_type => 'Any',
rev_major_version => 16,
rev_minor_version => 2,
rev_user_version => 1,
modrev_major_version => 18,
modrev_min_versione => 0,
modrev_user_version => 0,
name_xlate => true,
name_uid => 'XLS_0004',
name_label => 'Zoom auf Gemarkung/Flur/Flurstück',
command => '^C^C(C:BJ_TBLOGOUT);-vbarun BJ__POSFIND GEM_F_FL ALK',
small_img => 'ICBJ0161.BMP',
}
};


Die Macrogruppe ist wie folgt eingebaut:

Code: (dl )
1
2
3
$MacroGroups = {
"EBL_Werkzeug_1Macros" => $MacroMenus
};


Bei meiner Umsetzung in den Hash habe ich ein paar Sachen vereinfacht, um das mal deutlich zu machen:

Der Zweig
Code: (dl )
1
2
3
        name_xlate => true,
name_uid => 'XLS_0004',
name_label => 'Zoom auf Gemarkung/Flur/Flurstück',

lässt sich nämlich auch tiefer gliedern, z.B.:

Code: (dl )
1
2
3
4
XLS_0004 => {
xlat => true,
label => Zoom auf Gemarkung/Flur/Flurstück,
};


Ich weiß nun nicht, was hier zuerst entwickelt wurde, die XML-Sequenz oder die Datensruktur. Vermutlich hat da einer, wie so oft, zuerst das XML entwickelt und geschaut, wo er seine Daten am Besten unterbringt. Grundsätzlich gibt es da zwei Möglichkeiten:

1. Tag steht allein, es gibt attribute=value
<tag att='val'/>

Das kann zu
Code: (dl )
    tag => { att => val };

werden.

2. Tag wird geschlossen
Code: (dl )
<tag att='val'>Hier eine Weitere Information</tag>


Das kann zu
Code: (dl )
    tag => ['Hier eine Weitere Information', {att => val}]
werden (nurmal als Beispiel).

Für den Programmierer ist die XML-Sequenz völlig uninteressant, ihn interessiert einzig und allein die Datenstruktur, denn hierüber erfolgt der wahlfreie Zugriff (Random Acces) in seinem Programm und das passiert gewöhnlich im Hauptspeicher.

Abstrakt: Zwischen XML (Sequenz, Datei) und Datenstruktur (Hash) steht ein sogenannter Serializer. Der macht praktisch nichts weiter, als die Daten transportsicher zu verpacken. Ein Serializer vermittelt. Möglicherweise wird auch transformiert, d.h., aus einem Hash wird ein Array gemacht oder umgekehrt.

Warum ich das hier alles aufschreibe: Versuche, zu verstehen, welches Ergebnis dich erwartet, nachdem du auf CPAN diesen oder jenen XML-Serializer gefunden hast. Und versuche, zu verstehen, wie das Ergebnis, sprich: Hash/Array zustande kommt. Die Grundbausteine: Tags, Attribute, Label sind immer wieder dieselben. Nur die Datenstruktur, die kann bei gleichem Informationsgehalt völlig anders aussehen. Aus Meinem Beispiel-Hash ganz oben kannst du genausogut ein Array erzeugen ohne dass Informationen/Daten verlorengehen.

Versuche zu erkennen, wo ein Zyklus beginnt/endet und ob für deine Verarbeitung ein Hash oder Array besser passt. Letztendlich jedoch, musst Du wissen, ob du dem Entwickler des Serializers vertrauen kannst: Ob er dir genau das liefert, was am Besten in dein Programm passt.
Last edited: 2015-08-15 09:02:11 +0200 (CEST)

View full thread xml tiefer auslesen