delphi read xml element - PullRequest
       10

delphi read xml element

3 голосов
/ 30 марта 2011

Я новичок в XML, и нам нужно выполнить геокодирование с помощью нового Bing Spatial Data API .Мне удалось получить результат от них в формате XML.Как бы я прочитал конкретные элементы в ответе, т.е.Link, Status и ErrorMessages?

<?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>

Я использую Delphi XE.

С уважением, Питер

Ответы [ 4 ]

6 голосов
/ 30 марта 2011

Как насчет использования простого XPATH для получения запрошенных значений?

//Link[1]/node() - выбирает первый узел «Ссылка» из всего документа, а затем выбирает первый дочерний узел любого вида.Просто случается, что первый дочерний узел является неназванным узлом, содержащим фактическую https ссылку.

Предполагая, что документ XML загружен в Doc: TXMLDocument, вы можете извлечь ссылку с помощью этого кода:

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

Вы можете найти некоторую документацию по XPath , читая эти Примеры XPath на MSDN .Вы можете найти лучшую документацию в 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.
3 голосов
/ 30 марта 2011

Поскольку существует XML-схема для этих Bing Spatial Data Services , самый простой способ - импортировать эту схему с помощью мастера привязки данных XML Delphi, а затем использовать сгенерированные классы и интерфейсы Delphi для получения ваши данные из XML или поместите данные в XML.

Это похоже на то, что предложил Jørn E. Angeltveit , но его предложение использует простой XML для генерации классов из.
Это нормально, если у вас нет схемы, но когда у вас есть схема, всегда лучше импортировать схему.

Существует множество примеров использования Мастера привязки данных XML Delphi , поэтому сначала начните с него.

Если вам нужна помощь в привязке: задайте новый конкретный вопрос здесь.

3 голосов
/ 30 марта 2011

Если XML-структура достаточно стабильна, вы можете использовать инструмент связывания XML для генерации обычных классов Delphi для доступа к xml-документу.

Взгляните на эту страницу .

3 голосов
/ 30 марта 2011

Теперь вы должны проанализировать 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;
...