Сложность разбора XML с использованием TXMLDocument
Я не использовал XML раньше, и у меня возникают трудности с анализом XML с использованием TXMLDocument. (Delphi 10.1)
В моем приложении мне нужно найти название места, почтовый индекс и т. Д., Где была сделана фотография с использованием Lat и Long из информации EXIF, выполнив запрос обратного геокодирования в веб-службе Geonames - см. http://www.geonames.org/export/web-services.html
Эта часть работает нормально, но у меня проблемы с получением данных из возвращенного XML, который поставляется в виде
<?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>
Я пытаюсь поместить эти данные в запись:
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;
с этой тестовой функцией (в модуле данных с TXMLDocument и 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;
Последняя строка вызывает нарушение прав доступа. Я, очевидно, делаю что-то глупое, но я не вижу, что.
Как я уже говорил, я никогда раньше не использовал данные XML или TXMLDocument. Любая помощь наиболее ценится.
1 ответ
Получил это работает.
Пустые узлы вызывали нарушение прав доступа, теперь проверьте, не каждый ли ноль.
Также я должен был перейти к корневому узлу, найти его дочерний узел, а затем получить данные в дочерних узлах этого узла.
Спасибо вам @whosrdaddy и @Ssm за вашу помощь и указание мне в правильном направлении