Hilfe beim TXMLDocument
-
Hallo, ich versuche aus einen XML-Dokument die Werte "value", "min", "max" ... aus "temperature" auszulesen:
<current> <city id="2643743" name="London"> <coord lon="-0.13" lat="51.51"/> <country>GB</country> <sun rise="2015-06-03T03:47:06" set="2015-06-03T20:10:19"/> </city> <temperature value="281.661" min="281.661" max="281.661" unit="kelvin"/> <humidity value="81" unit="%"/> <pressure value="1032" unit="hPa"/> <wind> <speed value="1.06" name="Calm"/> <direction value="283.5" code="WNW" name="West-northwest"/> </wind> <clouds value="0" name="clear sky"/> <visibility/> <precipitation mode="no"/> <weather number="800" value="Sky is Clear" icon="01n"/> <lastupdate value="2015-06-03T22:31:37"/> </current>
... und das mit dem TXMLDocument-Objekt. Kann mir jemand den Code zum Auslesen von "value" in "temperature" als Beispiel geben? Danke schonmal im Voraus!
-
Siehe:
IXMLNode Eigenschaft Attributes
-
Bei XML-Elementen gibt es Text und Attribute.
//Nur Text <temperature>Temperatur</temperature> //Nur Attribute [code="cpp"]<temperature value="281.661" min="281.661" max="281.661" unit="kelvin"/> //Text und Attribute <temperature value="281.661" min="281.661" max="281.661" unit="kelvin">Aktuelle Temperatur</temperature>
Zuerst mußt du den Knoten "temperature" finden.
Dazu gibt es mehrere Möglichkeiten. Der Ausgangspunkt ist der übergeordnete Knoten.1. In einer Schleife alle Knoten durchgehen
for(int i=0;i < NodeParent->ChildNotes->Count;i++) { if(NodeParent->ChildNotes->Nodes[i]->NodeName == L"temperature") { NodeParent->ChildNotes->Nodes[i]->Text NodeParent->ChildNotes->Nodes[i]->GetAttribute(L"XXXX") } }
2. Den Knoten suchen
IXMLNode *NodeTemp = NodeParent->ChildNodes->FindNode(L"temperature"); if(NodeTemp != NULL) { // NodeTemp->Text = enthält "Aktuelle Temperatur" OleVariant ovValue = NodeTemp->GetAttribute(L"value"); if(ovValue.IsNull() == false) { // ovValue enthält "281.661" // Wert verarbeiten z.B. mit: System::UnicodeString usValue = ovValue; } ovValue = NodeTemp->GetAttribute(L"min"); if(ovValue.IsNull() == false) { .... } }
Ich hoffe, das hilft dir weiter. Es ist nicht getestet, ich habe es nur aus dem Gedächtnis aufgeschrieben. So in etwa müßte es aber funktionieren.
Noch ein Hinweis: Bei xx->NodeName, FindNode() und GetAttribute() unbedingt auf Groß-/Kleinschreibung achten.
NodeTemp->GetAttribute(L"value") = ok
NodeTemp->GetAttribute(L"Value") = Fehler bzw. NULL