首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >很难使用TXMLDocument解析XML

很难使用TXMLDocument解析XML
EN

Stack Overflow用户
提问于 2017-02-13 19:17:25
回答 1查看 297关注 0票数 0

我以前没有使用过XML,在使用TXMLDocument解析XML时遇到了困难。(Delphi 10.1)

在我的应用程序中,我需要通过在Geonames Web服务上执行反向地理编码查询,使用EXIF信息中的经纬度查找照片拍摄位置的地名和邮政编码等-请参阅http://www.geonames.org/export/web-services.html

这一部分工作得很好,但是我在从返回的XML中获取数据时遇到了问题,XML的形式是

代码语言:javascript
复制
<?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>

我正在尝试将此数据放入一个记录中:

代码语言:javascript
复制
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的DataModule中)

代码语言:javascript
复制
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 data或TXMLDocument。任何帮助都是非常感谢的。

EN

回答 1

Stack Overflow用户

发布于 2017-02-14 05:01:50

让它起作用了。

空节点是导致访问冲突的原因,现在检查每个节点是否为空。

另外,我应该找到根节点,找到它的子节点,然后获取该节点的子节点中的数据。

感谢@whosrdaddy和@Ssm的帮助,并为我指明了正确的方向

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42202759

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档