TBeXMLReader
TBeXMLReader
Klasse zum lesen einer XML-Datei bzw. XML-Daten. Nur verfügbar in Verbindung mit der Lizenz "XML Kommunikation".
Eigenschaften
Allgemeine-Eigenschaften
FileName:CDatei-Name der XML-Datei
Schema:CDatei-Name zur XML-Schema-Datei
Encoding:CCodierung der XML-Datei (default = "UTF-8")
Active:LTrue = XML-Datei zum lesen öffnen bzw. ist geöffnetFalse = XML-Datei schließen bzw. ist geschlossen
CurrElement: TBeXMLElementAktuell eingelesenes XML-Element (siehe ReadNextElement)
Aktive-Eigenschaften (Methoden)
ReadNextElement:LNächstes XML-Element inkl. der Attribute einlesen (ist anschließend über CurrElement abrufbar)
Ergebnis: True = Nächstes XML-Element wurde gelesen
False = keine weiteren XML-Elemente (EOF)
SchemaValid:LFührt eine Schema-Validierung durch
SchemaErrors:C Liste aller vorhandenen Schema-Fehler wenn SchemaValid = False ergab
Methoden
ReadFromXMLString(aXML:C)Wird kein Datei-Name angegeben, so kann mit dieser Methode der XML-Inhalt auch direkt per String geladen werden
Verwendung
-Der XML-Reader liest je ReadNextElement-Aufruf immer ein komplettes XML-Element inkl. aller Attribute und der Attribut-Werte aus, jedoch nicht die folgenden Unter-Elemente und nicht den Element-Wert! (Der Element-Wert ist ein eigenes XML-Text-Element, siehe Beispiel)
-Hierarchien können über CurrElement.Depth des aktuellen Elements ermittelt werden (siehe Beispiel).
ACHTUNG
oXMLReader.Active := false,
darf nicht vor dem Zerstören den Objektes mittels destroyobject aufgerufen werden!
Hintergrund:
Beim Zerstören den Objektes wird
oXMLReader.Active := false,
implizit aufgerufen.
Dabei kommt es zu Problemen, wenn dies zuvor bereits geschehen ist.
Beispiel
// HINWEIS: XML-Beispiele der Auswertung siehe Klasse "TBeXMLElement" / "TBeXMLAttribute"
// HINWEIS: Mit dem Beispiel-CodeBlock der Klasse "TBeXMLWriter" kann
// zum Testen eine realistische XML-Datei generiert werden!
|oXMLReader, oXMLElem, oXMLAttrib, cXMLDatei, i, k, m, tTime, lDoOutput|
cXMLDatei := 'C:\Delphi\VSS\Intern\3rd_Party\DIXml\Demos\output1.xml',
// XML-Reader instanziieren und XML-Datei öffnen
oXMLReader := CreateObject('TBeXMLReader','BeXMLReader'),
oXMLReader.Encoding := 'UTF-8',
oXMLReader.FileName := cXMLDatei,
oXMLReader.Active := true,
tTime := TimeEx(),
k := 0,
m := 0,
lDoOutput:= true,
while oXMLReader.ReadNextElement do
// aktuelles Element merken
oXMLElem := oXMLReader.CurrElement,
k++,
// Ist Element ein regulärer Node?
if oXMLElem.NodeType = XMLELEMELEMENT_NODE
or oXMLElem.NodeType = XMLELEMTEXT_NODE then
m++,
if lDoOutput then
// Element-Eigenschaften ausgeben
WriteLn( Replicate(' ', oXMLElem.Depth ) +
'Ebene: ' + Str(oXMLElem.Depth,3),
'Leeres Element: ' + iif(oXMLElem.IsEmpty, ' Ja ', 'Nein'),
'Hat einen Wert: ' + iif(oXMLElem.HasValue, ' Ja ', 'Nein'),
'Anz.Attribute: ' + Str(CollCount(oXMLElem.Attributes), 3),
'Name: ' + oXMLElem.Name,
iif( oXMLElem.Value <> '', 'Wert: ' + oXMLElem.Value, '' ) ),
endif,
// Element-Attribute ausgeben
for i := 1 to CollCount(oXMLElem.Attributes) do
// aktuelles Attribut merken
oXMLAttrib := CollItem(oXMLElem.Attributes, i),
if lDoOutput then
// Attribut-Eigenschaften ausgeben
WriteLn( Replicate(' ', oXMLElem.Depth ) +
' - Element-Typ: ' + Str(oXMLAttrib.NodeType,3),
'Name: ' + oXMLAttrib.Name,
'Wert: ' + oXMLAttrib.Value ),
endif,
next,
endif,
end,
tTime := Round((TimeEx() - tTime) * 24 * 60 * 60, 6),
writeln( FloatToStr(k) + ' XML-Elemente (davon ' + FloatToStr(m) + ' relevante Nodes) in '
+ FloatToStr(tTime) + ' Sekunden als Datei gelesen.' ),