Сложность разбора 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 за вашу помощь и указание мне в правильном направлении

Другие вопросы по тегам