Как насчет использования простого 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.