【问题标题】:Difficulty parsing XML using a TXMLDocument使用 TXMLDocument 难以解析 XML
【发布时间】:2017-07-01 08:41:19
【问题描述】:

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

在我的应用程序中,我需要通过在 Geonames Web Service 上进行反向地理编码查询,使用 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 数据或 TXMLDocument。非常感谢任何帮助。

【问题讨论】:

  • 您应该检查 StartItemNode 是否确实存在(即不为零)。使用您的调试器。这将是我的起点。
  • 谢谢,@Ssm。我刚刚检查了一下,节点为 nil。
  • 使用XML databinding wizard,Delphi会为你生成类。
  • 根节点也定义为DocumentElement,所以StartItemNode := DocumentElement.ChildNodes.FindNode
  • @whosrdaddy 是 'StartItemNode := DocumentElement.ChildNodes.FindNode('code');'工作

标签: xml delphi txmldocument


【解决方案1】:

搞定了。

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

我也应该去根节点,找到它的子节点然后获取数据在那个节点的子节点中。

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

【讨论】:

    猜你喜欢
    • 2012-03-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-12
    相关资源
    最近更新 更多