我以前没有使用过XML,在使用TXMLDocument解析XML时遇到了困难。(Delphi 10.1)
在我的应用程序中,我需要通过在Geonames Web服务上执行反向地理编码查询,使用EXIF信息中的经纬度查找照片拍摄位置的地名和邮政编码等-请参阅http://www.geonames.org/export/web-services.html
这一部分工作得很好,但是我在从返回的XML中获取数据时遇到了问题,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的DataModule中)
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。任何帮助都是非常感谢的。
发布于 2017-02-14 05:01:50
让它起作用了。
空节点是导致访问冲突的原因,现在检查每个节点是否为空。
另外,我应该找到根节点,找到它的子节点,然后获取该节点的子节点中的数据。
感谢@whosrdaddy和@Ssm的帮助,并为我指明了正确的方向
https://stackoverflow.com/questions/42202759
复制相似问题