2017-02-13 4 views
0

Ich habe XML vorher nicht verwendet und habe Schwierigkeiten beim Analysieren von XML mit einem TXMLDocument. (Delphi 10,1)Schwierigkeit, XML mit einem TXMLDocument zu analysieren

In meinem app ich brauche Ortsnamen und Postleitzahl etc. zu finden, wo ein Foto aufgenommen wurde mit der Breite und Länge der EXIF-Informationen durch eine Reverse-Geocoding Abfrage bei Geonames Web Service zu tun - siehe http://www.geonames.org/export/web-services.html

Dieser Teil funktioniert gut, aber Probleme habe, die Daten aus dem zurückgegebenen XML bekommen, die

in Form kommt
<?xml version="1.0" standalone="no"?> 
<geonames> 
    <code> 
     <postalcode>18500</postalcode> 
     <name>Guadix</name> 
     <countryCode>ES</countryCode> 
     <lat>37.29932</lat> 
     <lng>-3.13922</lng> 
     <adminCode1>AN</adminCode1> 
     <adminName1>Andalucia</adminName1> 
     <adminCode2>GR</adminCode2> 
     <adminName2>Granada</adminName2> 
     <adminCode3/> 
     <adminName3/> 
     <distance>0.58142</distance> 
    </code> 
</geonames> 

ich versuche, diese Daten in einen Datensatz zu setzen:

TGeonamesPostalcodeData = record 
    gpcPostalcode: string; 
    gpcName: string; 
    gpcCountryCode: string; 
    gpcLat: string; 
    gpcLng: string; 
    gpcAdminCode1: string; 
    gpcAdminName1: string; 
    gpcAdminCode2: string; 
    gpcAdminName2: string; 
    gpcAdminCode3: string; 
    gpcAdminName3: string; 
    gpcDistance: string; 
    end; 

mit dieser Testfunktion (in einem Datenmodul mit einem TXMLDocument und einem TIdHTTP)

function TdmGeonames.GetGeonamesPostalcodeData(dLatitude, dLongitude: 
    Double; sUsername: string): TGeonamesPostalcodeData; 
    const 
    URL1: string = 'http://api.geonames.org/findNearbyPostalCodes?lat='; 
    URL2: string = '&style=FULL&maxRows=1&username='; 
var 
    sURL: TFilename; 
    s, sLat, sLng, sBuffer: string; 
    StartItemNode, NodeElement: IXMLNode; 
    sWidestring: WideString; 
begin 
    sLat := FloatToStrF(dLatitude, ffGeneral, 8, 4); 
    sLng := FloatToStrF(dLongitude, ffGeneral, 8, 4); 
    sURL := URL1 + sLat + '&lng=' + sLng + URL2 + sUsername; 
    sBuffer := IdHTTPGeonames.Get(sURL); 
    with XMLDocumentGeonames do 
    begin 
     LoadFromXML(sBuffer); 
     Active := True; 
     StartItemNode := ChildNodes.First.ChildNodes.FindNode('postalcode'); 
     // NodeElement := StartItemNode; 
     Result.gpcPostalcode := StartItemNode.ChildNodes['postalcode'].Text; 

end; 

Die letzte Zeile verursacht eine Zugriffsverletzung auf. Ich mache offensichtlich etwas Dummes, aber ich kann nicht sehen was.

Wie gesagt, ich habe noch nie XML-Daten oder TXMLDocument verwendet. Jede Hilfe, die am meisten geschätzt wird.

+0

sollten Sie prüfen, ob StartItemNode tatsächlich vorhanden ist (das heißt nicht nil). Verwenden Sie Ihren Debugger. Das wäre mein Ausgangspunkt. – Dsm

+0

Danke, @SM. Ich habe es nur überprüft und der Knoten ist NULL. – BadDog

+1

Verwenden Sie den [XML DataBinding Wizard] (http://docwiki.embarcadero.com/RADStudio/de/Verwendung des_XML_Data_Binding_Wizard), Delphi generiert Klassen für Sie. – whosrdaddy

Antwort

0

Es funktioniert.

Leere Knoten haben die Zugriffsverletzung verursacht, jetzt überprüfen Sie, dass jeder nicht gleich Null ist.

Auch ich sollte zum Wurzelknoten gegangen sein, finden Sie es Kindknoten dann erhalten Sie die Daten in Kindknoten dieses Knotens.

Dank Sie @whosrdaddy und @Ssm für Ihre Hilfe und zeigt mir in die richtige Richtung