Solución:
Eche un vistazo al propio Delphi TXMLDocument
componente, por ejemplo:
uses
..., XMLIntf, XMLDoc;
procedure TForm1.FormCreate(Sender: TObject);
var
Vehicle: IXMLNode;
begin
XMLDocument1.FileName :='vehicle.xml';
XMLDocument1.Active := True;
try
Vehicle := XMLDocument.DocumentElement;
txtType.Text := Vehicle.ChildNodes['type'].Text;
txtModel.Text := Vehicle.ChildNodes['model'].Text;
txtnumber.Text := Vehicle.ChildNodes['number'].Text;
finally
XMLDocument1.Active := False;
end;
end;
Alternativamente, use el IXMLDocument
interfaz directamente (que TXMLDocument
implementos):
uses
..., XMLIntf, XMLDoc;
procedure TForm1.FormCreate(Sender: TObject);
var
Doc: IXMLDocument;
Vehicle: IXMLNode;
begin
Doc := LoadXMLDocument('vehicle.xml');
Vehicle := Doc.DocumentElement;
txtType.Text := Vehicle.ChildNodes['type'].Text;
txtModel.Text := Vehicle.ChildNodes['model'].Text;
txtnumber.Text := Vehicle.ChildNodes['number'].Text;
end;
Actualizar: el XML en la pregunta se ha modificado para ahora envolver el vehicle
elemento dentro de un data
elemento, y tener múltiples vehicle
elementos. Por lo tanto, el código anterior debe ajustarse en consecuencia, por ejemplo:
uses
..., XMLIntf, XMLDoc;
procedure TForm1.FormCreate(Sender: TObject);
var
Doc: IXMLDocument;
Data: IXMLNode;
Node: IXMLNode;
I: Integer;
begin
Doc := LoadXMLDocument('vehicle.xml');
Data := Doc.DocumentElement;
for I := 0 to Data.ChildNodes.Count-1 do
begin
Node := Data.ChildNodes[I];
// if all of the child nodes will always be 'vehicle' only
// then this check can be removed...
if Node.LocalName="vehicle" then
begin
// use Node.ChildNodes['type'], Node.ChildNodes['model'],
// and Node.ChildNodes['number'] as needed...
end;
end;
end;
Puede leer el archivo XML utilizando la unidad MSXML (o cualquier otro analizador XML).
Le proporciona una estructura de árbol que representa el archivo XML. Donde vehículo es el nodo superior y los otros tres son los nodos secundarios.
Cada nodo tiene una propiedad de texto que se puede utilizar para obtener el valor. Puede asignar eso a los cuadros de texto en su formulario.
Muestra de código:
uses
ActiveX,
MSXML;
procedure TForm1.ReadFromXML(const AFilename: string);
var
doc : IXMLDOMDocument;
node : IXMLDomNode;
begin
CoInitialize; // Needs to be called once before using CoDOMDocument.Create;
if not FileExists(AFileName) then
Exit; // Add proper Error handling.
doc := CoDOMDocument.Create;
doc.load(AFileName);
if (doc.documentElement = nil) or (doc.documentElement.nodeName <> 'vehicle') then
Exit; // Add proper Error handling.
node := doc.documentElement.firstChild;
while node<>nil do begin
if node.nodeName="model" then
txtModel.Text := node.text;
if node.nodeName="number" then
txtNumber.Text := node.text;
if node.nodeName="type" then
txtType.Text := node.text;
node := node.nextSibling;
end;
end;