如何从xml文件中读取数据并以delphi语言显示在文本框中

Ban*_*ana 9 delphi delphi-2009

我是delphi语言的新手,在这里我有一个疑问,我有一个名为vehicle.xml的xml文件.

看起来像这样

<data>
<vehicle>
    <type>Car</type>
    <model>2005</model>
    <number>1568</number>
</vehicle>
<vehicle>
    <type>Car</type>
    <model>2009</model>
    <number>1598</number>
</vehicle>
</data>
Run Code Online (Sandbox Code Playgroud)

我的Delphi表单包含三个文本框:

  • txtType
  • txtModel
  • txtnumber

在加载页面时,我想在文本框中显示vehicle.xml的内容,如:

  • txtType =汽车
  • txtModel = 2005
  • txtNumber = "1568"

Rem*_*eau 12

看看Delphi自己的TXMLDocument组件,例如:

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;
Run Code Online (Sandbox Code Playgroud)

或者,IXMLDocument直接使用界面(TXMLDocument包装):

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;
Run Code Online (Sandbox Code Playgroud)

更新:问题中的XML已被更改为现在将vehicle元素包装在元素内部data,并具有多个vehicle元素.所以上面的代码必须相应调整,例如:

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;
Run Code Online (Sandbox Code Playgroud)

  • @ShaunRoselt:在我发布这个答案之后,问题中的XML被改变了.这个答案是针对不同的XML编写的,其中顶级元素是唯一的`<vehicle>`元素.现在XML的结构已经改变,因此需要相应地调整代码.我已经更新了我的答案. (2认同)

Too*_*the 5

您可以使用MSXML单元(或任何其他XML解析器)读取XML文件。

它为您提供了一个表示XML文件的树形结构。车辆是顶部节点,其他三个是子节点。

每个节点都有一个文本属性,可用于获取该值。您可以将其分配给表单上的文本框。

代码示例:

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;
Run Code Online (Sandbox Code Playgroud)

  • 看一下Delphi自己的`TXMLDocument`包装器组件,而不是直接访问`MSXML`引擎。 (2认同)