Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   XML (https://www.delphipraxis.net/46-xml/)
-   -   Delphi Woher weiß ich, von welchem Typ meine XML-Inhalte sind? (https://www.delphipraxis.net/176055-woher-weiss-ich-von-welchem-typ-meine-xml-inhalte-sind.html)

Der schöne Günther 9. Aug 2013 12:37

Woher weiß ich, von welchem Typ meine XML-Inhalte sind?
 
Einfaches Beispiel:
Code:
<rootNode>
   <eineZahl>42</eineZahl>
   <einBoolean>False</einBoolean>
   <einFloat>99.3</einFloat>
</rootNode>
Bislang bin ich immer hingegangen und
  • habe den gesuchten Knoten (z.B. "eineZahl") gesucht (Typ IXMLNode)
  • mir den enthaltenen Wert geholt (IXMLNode.NodeValue)
  • und diesen Wert in eine Variable gesteckt (meineZahl := meinKnoten.NodeValue).

Ich habe mich immer gefreut, dass der implizite Cast von
Delphi-Quellcode:
NodeValue
nach irgendwohin so toll funktioniert. NodeValue ist übrigens vom Typ
Delphi-Quellcode:
OleVariant
. Nun möchte ich nicht mehr implizit irgendwohin casten, sondern wissen, was für ein Typ das überhaupt ist.
Delphi-Quellcode:
 System.Variants.VarType(Variant):TVarType
liefert leider immer
Delphi-Quellcode:
OleStr
zurück.

Mir ist klar, dass die Sache nicht eindeutig ist: "42" könnte ein Integer, eine Fließkommazahl oder ein String sein.

Was ist der beste Ansatz? In der XML für jeden Knoten anzugeben, von welchem Typ er ist? Beispiel:

Code:
<rootNode>
   <eineZahl type="Integer">42</eineZahl>
   <einBoolean type="Boolean">False</einBoolean>
   <einFloat type="Single">99.3</einFloat>
</rootNode>
Mit
Delphi-Quellcode:
IXMLNode.NodeType
kann ich auch nichts anfangen, das sagt ja nur aus, was für einen Stellenwert der Knoten selbst in der XML hat, nichts über seinen Inhalt.

taveuni 9. Aug 2013 12:52

AW: Woher weiß ich, von welchem Typ meine XML-Inhalte sind?
 
Wenn Du das brauchst einfach ein Schema dazu machen.

Der schöne Günther 9. Aug 2013 13:02

AW: Woher weiß ich, von welchem Typ meine XML-Inhalte sind?
 
Ich weiß nicht, ob das das richtige wäre.

Die XML-Blöcke werden mittels IPC ausgetauscht, ich wüsste spontan nicht, wie ich ein Schema oder eine DTD (evtl. auch auf unterschiedlichen Maschinen) referenzieren sollte.

Ich würde ungern nebenher ein Schema pflegen bzw dynamisch erstellen, denn der Aufbau und Inhalt des XML-Blocks unterliegt eigentlich keinen Regeln.

Außerdem wüsste ich spontan nicht, wie ich in Delphi mittels MSXML mit dem Schema arbeiten könnte. Ich glaube nicht, dass mir NodeValue dann plötzlich ein OleVariant von einem passenderen Typ zurückgibt?

uligerhardt 9. Aug 2013 13:11

AW: Woher weiß ich, von welchem Typ meine XML-Inhalte sind?
 
Was willst du denn mit den Werten machen, wozu du den Typ wissen musst?

p80286 9. Aug 2013 13:29

AW: Woher weiß ich, von welchem Typ meine XML-Inhalte sind?
 
Zitat:

Zitat von Der schöne Günther (Beitrag 1224142)
, denn der Aufbau und Inhalt des XML-Blocks unterliegt eigentlich keinen Regeln.

dann gib doch den Typen mit!?
Code:
 <eineZahl=Integer>42</eineZahl>
   <einBoolean=Bool>False</einBoolean>
   <einFloat=Float>99.3</einFloat>
Gruß
K-H

Der schöne Günther 9. Aug 2013 13:50

AW: Woher weiß ich, von welchem Typ meine XML-Inhalte sind?
 
Das habe ich bislang ja auch vor. Andere Ideen (wie Typen über Schemas oder DTDs angeben) sind aber immer willkommen :-)

Zitat:

Zitat von uligerhardt (Beitrag 1224145)
Was willst du denn mit den Werten machen, wozu du den Typ wissen musst?

Ich will den Kram ohne etwas damit zu tun in eine Baumansicht packen damit der Benutzer den Inhalt verändern kann. Lese ich beispielsweise einen Boolean, soll der Benutzer einfach ein Häkchen dort setzen oder wegnehmen können. Lasse ich ihn weiterhin reinen Text dort eingeben, gibt er wahrscheinlich "Nein" oder "Si" ein.

Mehr steckt eigentlich nicht dahinter...

uligerhardt 9. Aug 2013 13:56

AW: Woher weiß ich, von welchem Typ meine XML-Inhalte sind?
 
Kannst du dafür nicht irgendwie das Wissen, das du im Ursprungspost beschrieben hast (von wegen NodeValue von "eineZahl" lesen, auf **Integer**-Variable meineZahl zuweisen usw.) zugreifbar machen?

Der schöne Günther 9. Aug 2013 17:35

AW: Woher weiß ich, von welchem Typ meine XML-Inhalte sind?
 
Ja, im ersten Fall wusste ich genau, dass zwischen den Tags <beliebigeZahl> ein Integer steht. Jetzt habe ich ein anderes Szenario und habe kein Wissen über die zu erwartende Strukturierung der Daten.

Ich gebe jetzt immer den Datentyp als Attribut des Knotens mit. Ist zwar etwas hässlich, immer das Attribut anzuschauen und dann eine dicke Fallunterscheidung für alle Typen die man unterstützen möchte... Aber besser als nichts ;-)

Insider2004 9. Aug 2013 19:05

AW: Woher weiß ich, von welchem Typ meine XML-Inhalte sind?
 
XML kennt nur Strings. Wie was evaluiert wird, bestimmt das DTD-File.

mjustin 10. Aug 2013 07:30

AW: Woher weiß ich, von welchem Typ meine XML-Inhalte sind?
 
Zitat:

Zitat von Der schöne Günther (Beitrag 1224142)
Außerdem wüsste ich spontan nicht, wie ich in Delphi mittels MSXML mit dem Schema arbeiten könnte. Ich glaube nicht, dass mir NodeValue dann plötzlich ein OleVariant von einem passenderen Typ zurückgibt?

Wenn ein XML Schema vorhanden ist (im XSD Format), dann kann Delphi daraus über den Schema Binding Wizard (ab Professional enthalten) eine Klassenstruktur erzeugen, die typsichere Properties hat. Man arbeitet dann nicht mehr mit NodeValue. Die IDE unterstützt dann die Auswahl der Properties durch CodeInsight (Punkt + Leertaste -> Anzeige aller an dieser Stelle der XML Hierarchie sichtbaren Elemente).


Alle Zeitangaben in WEZ +1. Es ist jetzt 02:31 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz