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


Anmelden zum Antworten