3

XMLは初めてで、新しいBing SpatialDataAPIを使用してGeoCodingを実行する必要があります。私はなんとかそれらからxml形式で結果を取り戻すことができました。応答の特定の要素をどのように読み取るか、つまり。リンク、ステータス、エラーメッセージ?

<?xml version="1.0" encoding="utf-8"?>
<Response xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="http://schemas.microsoft.com/search/local/ws/rest/v1">
    <Copyright>Copyright © 2011 Microsoft and its suppliers. All rights reserved. This API cannot be accessed and the content and any results may not be used, reproduced or transmitted in any manner without express written permission from Microsoft Corporation.</Copyright>
    <BrandLogoUri>http://spatial.virtualearth.net/Branding/logo_powered_by.png</BrandLogoUri>
    <StatusCode>201</StatusCode>
    <StatusDescription>Created</StatusDescription>
    <AuthenticationResultCode>ValidCredentials</AuthenticationResultCode>
    <TraceId>ID|02.00.82.2300|</TraceId>
    <ResourceSets>
        <ResourceSet>
            <EstimatedTotal>1</EstimatedTotal>
            <Resources>
                <DataflowJob>
                    <Id>ID</Id>
                    <Link role="self">https://spatial.virtualearth.net/REST/v1/dataflows/Geocode/ID</Link>
                    <Status>Pending</Status>
                    <CreatedDate>2011-03-30T08:03:09.3551157-07:00</CreatedDate>
                    <CompletedDate xsi:nil="true" />
                    <TotalEntityCount>0</TotalEntityCount>
                    <ProcessedEntityCount>0</ProcessedEntityCount>
                    <FailedEntityCount>0</FailedEntityCount>
                </DataflowJob>
            </Resources>
        </ResourceSet>
    </ResourceSets>
</Response>

DelphiXEを使用しています。

よろしく、ピーター

4

4 に答える 4

6

単純なXPATHを使用して、要求された値を取得するのはどうですか?

//Link[1]/node()-ドキュメント全体から最初の「リンク」ノードを選択してから、任意の種類の最初の子ノードを選択します。最初の子ノードが、実際のhttpsリンクを含む名前のないノードであることが起こります。

XMLドキュメントがにロードされていると仮定すると、Doc: TXMLDocument次のコードでリンクを抽出できます。

(Doc.DOMDocument as IDomNodeSelect).selectNode('//Link[1]/node()').nodeValue

これらのXPathの例をMSDNで読んで、XPathに関するいくつかのドキュメントを見つけることができます。あなたはw3schoolsでより良いドキュメントを見つけるかもしれません。さらに、XPathを使用して要求された3つの値を抽出して表示する、単純な(ただし完全な)コンソールアプリケーションを次に示します。

program Project14;

{$APPTYPE CONSOLE}

uses
  SysUtils,
  Xmldoc,
  xmldom,
  ActiveX;

var X: TXMLDocument;
    Node: IDOMNode;
    Sel: IDomNodeSelect;

begin
  try
    CoInitialize(nil);

    X := TXMLDocument.Create(nil);
    try

      // Load XML from a string constant so I can include the exact XML sample from this
      // question into the code. Note the "SomeNode" node, it's required to make that XML
      // valid.

      X.LoadFromXML(
        '<SomeNode>'+
        '  <Link role="self">' +
        '    https://spatial.virtualearth.net/REST/v1/dataflows/Geocode/jobid' +
        '  </Link>' +
        '  <Status>Aborted</Status>' +
        '  <ErrorMessage>The data uploaded in this request was not valid.</ErrorMessage>' +
        '</SomeNode>'
      );

      // Shortcut: Keep a reference to the IDomNodeSelect interface

      Sel := X.DOMDocument as IDomNodeSelect;

      // Extract and WriteLn() the values. Painfully simple!

      WriteLn(Sel.selectNode('//Link[1]/node()').nodeValue);
      WriteLn(Sel.selectNode('//Status[1]/node()').nodeValue);
      WriteLn(Sel.selectNode('//ErrorMessage[1]/node()').nodeValue);

      ReadLn;
    finally X.Free;
    end;
  except
    on E: Exception do
      Writeln(E.ClassName, ': ', E.Message);
  end;
end.
于 2011-03-30T09:02:44.873 に答える
3

これらのBingSpatialData ServicesにはXMLスキーマがあるため、最も簡単な方法は、Delphi XMLデータバインディングウィザードを使用してそのスキーマをインポートし、生​​成されたDelphiクラスとインターフェイスを使用してXMLからデータを取得するか、データを配置することです。 XMLで。

これはJørnE。Angeltveitが提案したものと似ていますが、彼の提案はプレーンXMLを使用してクラスを生成します。
スキーマがない場合は問題ありませんが、スキーマがある場合は、スキーマをインポートすることをお勧めします。

Delphi XMLデータバインディングウィザードの使用例はたくさんあるので、最初にそこから始めてください。

バインディングについてサポートが必要な場合:ここで新しい特定の質問をしてください。

于 2011-03-30T09:03:31.667 に答える
3

XML構造がかなり安定している場合は、XMLバインディングツールを使用して、xmlドキュメントにアクセスするための通常のDelphiクラスを生成できます。

このページを見てください。

于 2011-03-30T07:59:35.760 に答える
2

次に、XMLファイルを解析する必要があります。最も単純なケース(XMLタグを知っている)では、次のようになります。

var
  XMLDoc: IXMLDocument;
  Node: IXMLNode;
  I: Integer;
  role, link: string;

begin
  XMLDoc:= TXMLDocument.Create(nil);
  XMLDoc.LoadFromFile(AFileName);

  for I:= 0 to XMLDoc.DocumentElement.ChildNodes.Count - 1 do begin
    Node:= XMLDoc.DocumentElement.ChildNodes[I];
    if Node.NodeType = ntElement then begin
      if Node.NodeName = 'Link' then begin
        if Node.HasAttribute('role') then
          role:= Node.Attributes['role'];
        if not VarIsNull(Node.NodeValue) then
          link:= Node.NodeValue;
[..]
      end;
    end;
  end;
end;
于 2011-03-30T07:29:05.420 に答える