2017-02-13 97 views
0

我之前没有使用过XML,并且无法使用TXMLDocument解析XML。 (德尔福10.1)使用TXMLDocument解析XML时遇到困难

在我的应用我需要找到一个照片是使用从EXIF信息的纬度和长期做在国地名的Web服务反向地理编码查询所采取的地名和邮政编码等 - 看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一个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数据或TXMLDocument。最受赞赏的任何帮助。

+0

你应该检查StartItemNode确实存在(即不为零)。使用你的调试器。这将是我的出发点。 – Dsm

+0

谢谢,@Ssm。我刚刚检查过它,并且节点没有。 – BadDog

+1

使用[XML数据绑定向导](http://docwiki.embarcadero.com/RADStudio/en/Using_the_XML_Data_Binding_Wizard),Delphi会为你生成类。 – whosrdaddy

回答

0

得到它的工作。

空节点导致访问冲突,现在检查每一个不是零。

另外,我应该去了根节点,找到它的子节点,然后得到的数据是在该节点的子节点。

感谢您@whosrdaddy和@Ssm您的帮助和指点我朝着正确的方向