Sehr große XML Datei parsen und in Jet-DB schreiben. Wie???

27/02/2015 - 13:23 von Wilfried Dietrich | Report spam
Ich bekomme / habe eine sehr große XML-Datei (250 - 300 MB),
die eine Datenbank mit vielen Tabellen und Relationen "enthàlt".
Diese XML-Daten möchte ich in eine Jet-DB schreiben.
Die DB bzw. die Struktur / Tabellen habe ich schon in einer leeren
Jet-DB nachgebildet.
Die DB und dass "Hineinschreiben" ist nicht das Problem, aber das
Lesen der Daten aus der XML-Datei.

Ich habe mich schon etwas mit dem SAX-Parser beschàftigt und die
XML-Beispiele, die nur ein Element enthalten, auch irgendwie 'verstanden'.
Meine XML-Datei enthàlt aber mehrere Nachrichtentypen (Elemente)
die komplexe Typen enthalten, die wiederum komplexe Typen mit Elementen
enthalten kann. Da blicke ich einfach nicht mehr durch bzw. ich weiß
noch nicht wie ich das bewerkstelligen kann.
Es kann zig mal startElement hintereinander kommen, dann Daten mit
startElement und endElement, dann mehrfach startElement, dann
wieder Daten und dann die ganzen endElement...

Wie gehe ich da am besten ran?
Wie merke ich mir (im Programm) wo ich bin?
Nach welchem Konzept arbeite ich das am besten ab?
Hat schon jemand Erfahrung damit oder kennt ein gutes Tutorial?

Gruß
Wilfried
 

Lesen sie die antworten

#1 Ulrich Korndoerfer
28/02/2015 - 11:00 | Warnen spam
Hallo Wilfried,

Wilfried Dietrich schrieb:
Ich bekomme / habe eine sehr große XML-Datei (250 - 300 MB),
die eine Datenbank mit vielen Tabellen und Relationen "enthàlt".
Diese XML-Daten möchte ich in eine Jet-DB schreiben.
Die DB bzw. die Struktur / Tabellen habe ich schon in einer leeren
Jet-DB nachgebildet.
Die DB und dass "Hineinschreiben" ist nicht das Problem, aber das
Lesen der Daten aus der XML-Datei.

Ich habe mich schon etwas mit dem SAX-Parser beschàftigt und die
XML-Beispiele, die nur ein Element enthalten, auch irgendwie 'verstanden'.
Meine XML-Datei enthàlt aber mehrere Nachrichtentypen (Elemente)
die komplexe Typen enthalten, die wiederum komplexe Typen mit Elementen
enthalten kann. Da blicke ich einfach nicht mehr durch bzw. ich weiß
noch nicht wie ich das bewerkstelligen kann.
Es kann zig mal startElement hintereinander kommen, dann Daten mit
startElement und endElement, dann mehrfach startElement, dann
wieder Daten und dann die ganzen endElement...

Wie gehe ich da am besten ran?
Wie merke ich mir (im Programm) wo ich bin?
Nach welchem Konzept arbeite ich das am besten ab?
Hat schon jemand Erfahrung damit oder kennt ein gutes Tutorial?



Ich nehme mal an daß Du mit dem MS XML Parser arbeitest. Am einfachsten
wàre hier, nicht den SAX-Parser zu verwenden. Die Arbeit, die XML Datei
einzulesen und aus ihrem Inhalt hierarchisch korrekt ein DOM zu
erstellen überlàsst man einfach dem XML Parser. DOMs (Document Object
Model) kennt man ja zB von Webbrowsern. Auch dort werden DOMs verwendet.
Hier würde das DOM alle Elemente der XML Datei in hierarchischer Form
von Eltern und Kindern und Kindeskindern etc enthalten. Jedes Tag im XML
File wird auf einen Knoten (Node) im DOM abgebildet. Jeder Knoten (Node)
im DOM hat hier einen Namen (den des XML-Tags), eine Attributaufzàhlung
(deren Namen und Werte), den "Wert" respektive Inhalt des Tags und ggf.
eine Aufzàhlung von Kindknoten.

Könnte also so aussehen: ein Datenbankknoten hat mehrere Kindknoten (die
Tabellenknoten). Diese haben ihrerseits mehrere Kindknoten (die
Rowknoten. Und diese wiederum haben ebenfalls mehrere Kindnoten (die
Feldknoten).

Ein bisschen aufpassen muß man auf die Werte eines Knotens bzw Tags. Es
gibt hier bezüglich des Aufbaus von XML-Dateien 3 Varianten:

- der Tag-Wert ist in einem Attribut untergebracht

zB <Feld Name="IrgendEinName" Wert="Der Feldwert"></Feld>

- der Tag-Wert ist eben der Tagwert

zB <Feld Name="IrgendEinName">Der Feldwert></Feld>

- und die Mischformen

Wenn Du unbedingt mit dem SAX-Parser arbeiten willst musst Du das
Abbilden selber übernehmen. Der MS XML-Parser stellt hier Interfaces
(VB-freundliche) zur Verfügung. Das zentrale Interface heißt
IVBSAXContentHandler. Also eine VB-Klasse erstellen und mit ihr das
Interface implementieren. Wie üblich müssen alle Interfacemethoden
implementiert werden, die zentralen drei sind:

- startElement
- characters
- endElement

startElement wird vom MS XML-Parser aufgerufen, sobald er ein neues
Starttag geparst hat. Übermittelt wird ua der Tag Name und die Attribute
samt Werten des Tags.

characters wird aufgerufen sobald entweder ein Endtag erkannt wurde oder
noch ein Starttag erkannt wurde. Das dumme an XML ist daß der Wert eines
Tags mit "Untertags" gesprenkelt sein darf und dabei leider nicht
festgelegt ist, was denn nun der eigentliche Wert des Tags ist. Das
liegt beim Betrachter, dies korrekt zuu interpretieren.

Ein Beispiel in HMTL (welches ja ursprünglich als "Vorbild" XML bzw
genauer SMIL hatte):

<p>Dies <span>ist ein <b>fett</b> geschriebener und <i>schràg</i>
gestellter</span> Text.</p>

Als Wert von <p> könnte man hier annehmen: "Dies ist ein fett
geschriebener und schràg gestellter Text."

Der SAX Parser würde hier aufrufen:

<p>-> startElement
Dies -> characters
<span>-> startElement
ist ein -> characters
<b>-> startElement
fett-> characters
</b>-> endElement
geschriebener und -> characters
<i>-> startElement
schràg-> characters
</i>-> endElement
gestellter Text.-> characters
</p>-> endElement

Wenn Du das jetzt nachverfolgst, siehst Du, daß, würde man allen Text,
den characters zwischen dem startElement und endElement von p geliefert
hat, einfach aneinanderhàngen, genau

"Dies ist ein fett geschriebener und schràg gestellter Text."

herauskommen würde.

Andererseits ist es auch legitim (und bei Deinem Datenbankbeispiel wird
das wohl auch so sein), als Wert von p "Dies Text." anzunehmen. Es wàre
auch legitim, das Auftreten von solchen "verstreuten" Werten nicht zu
erlauben. Oder sogar komplett zu verbieten, daß ein Tag, sobald es
"Untertags" enthàlt, auch noch einen Wert enthàlt. Und wie das Auftreten
von Whitespace in der Datei (sinnvoll zur optischen Gliederung) zu
handlen ist, davon will ich erst gar nicht anfangen.

Kein Wunder, daß es XML gibt, wo kein Tag einen Wert hat und jeglicher
Whitespace "am Rand" ignoriert wird. MS tut sich da besonders hervor. In
dieser Variante gibt es nur "leere" Tags und alle Werte werden über
Tagattribute transportiert. Welche Variante bei Deiner XML-Datei
verwendet wird beeinflusst natürlich die Parsingstrategie.

Der am einfachsten zu handlende Aufbau wàre ein solcher mit solchen
"leeren" Tags, zb:

<DataBase Name="MyDB">
<Table Name="MyTable">
<Row No="1">
<Field Name="MyField1" Value="MyFieldsValue1"\>
:
<Field Name="MyFieldn" Value="MyFieldsValuen"\>
</Row>
:
<Row No="n">
<Field Name="MyField1" Value="MyFieldsValue1"\>
:
<Field Name="MyFieldn" Value="MyFieldsValuen"\>
:
</Row>
</Table>

etc

Hier könnte man beim SAX Parsen jeglichen Aufruf von characters
ignorieren. Alles was man braucht wird in startElement transportiert. Da
man beim SAX Parsen generell mit einer stackartigen (LIFO)
Programmstruktur arbeiten sollte, die die eintrudelnden Daten einfach
auf eine hierarchische Datenhaltung abbilden kann, würde man hier
endElement nur noch als Trigger fürs Poppen vom Stack verwenden müssen.

Ulrich Korndoerfer

VB tips, helpers, solutions -> http://www.prosource.de/Downloads/
MS Newsgruppen Alternativen -> http://www.prosource.de/ms-ng-umzug.html

Ähnliche fragen