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.
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
Danke, @SM. Ich habe es nur überprüft und der Knoten ist NULL. – BadDog
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