如何在delphi中打开/加载xml文件中的数据到tcxgrid中?

如何在delphi中打开/加载xml文件中的数据到tcxgrid中?,xml,delphi,tcxgrid,Xml,Delphi,Tcxgrid,如何在delphi中将xml文件中的数据打开/加载到tcxgrid?首先,您没有提供任何xml数据,因此我使用了以下方法: <?xml version="1.0"?> <Tests> <Test TestId="0001" TestType="CMD"> <Name>Convert number to string</Name> <CommandLine>Examp1.EXE</CommandLin

如何在delphi中将xml文件中的数据打开/加载到tcxgrid?

首先,您没有提供任何xml数据,因此我使用了以下方法:

<?xml version="1.0"?>
<Tests>
  <Test TestId="0001" TestType="CMD">
    <Name>Convert number to string</Name>
    <CommandLine>Examp1.EXE</CommandLine>
    <Input>1</Input>
    <Output>One</Output>
  </Test>
  <Test TestId="0002" TestType="CMD">
    <Name>Find succeeding characters</Name>
    <CommandLine>Examp2.EXE</CommandLine>
    <Input>abc</Input>
    <Output>def</Output>
  </Test>
  <Test TestId="0003" TestType="GUI">
    <Name>Convert multiple numbers to strings</Name>
    <CommandLine>Examp2.EXE /Verbose</CommandLine>
    <Input>123</Input>
    <Output>One Two Three</Output>
  </Test>
  <Test TestId="0004" TestType="GUI">
    <Name>Find correlated key</Name>
    <CommandLine>Examp3.EXE</CommandLine>
    <Input>a1</Input>
    <Output>b1</Output>
  </Test>
  <Test TestId="0005" TestType="GUI">
    <Name>Count characters</Name>
    <CommandLine>FinalExamp.EXE</CommandLine>
    <Input>This is a test</Input>
    <Output>14</Output>
  </Test>
  <Test TestId="0006" TestType="GUI">
    <Name>Another Test</Name>
    <CommandLine>Examp2.EXE</CommandLine>
    <Input>Test Input</Input>
    <Output>10</Output>
  </Test>
</Tests>
以及实施:

function TForm8.GetXMLFileName: String;
begin
  Result := ExtractFilePath(Application.ExeName) + 'test.xml';
end;
然后将XML文件转换为数据集:

procedure TForm8.DomToDataset(XMLNode: IXMLNode; Dataset: TDataset);
var
  AttrNode: IXMLNode;

  procedure CreateFields;
  var
    StringField: TStringField;
    i: Integer;
    ChildNode: IXMLNode;
  begin
    for i := 0 to AttrNode.ChildNodes.Count - 1 do
    begin
      ChildNode := AttrNode.ChildNodes.Get(i);
      StringField := TStringField.Create(Dataset);
      StringField.Size := 50;
      StringField.FieldName := ChildNode.NodeName;
      StringField.DisplayLabel := ChildNode.NodeName;
      StringField.Dataset := Dataset;
      StringField.Name := 'StringField' + IntToStr(Dataset.Fields.Count + 1);
    end;
  end;

var
  i, J: Integer;
begin
  Dataset.Close;
  Dataset.Fields.Clear;

  for i := 0 to XMLNode.ChildNodes.Count - 1 do
  begin
    AttrNode := XMLNode.ChildNodes.Get(i);

    if Dataset.Fields.Count = 0 then
      CreateFields;

    Dataset.Open;

    Dataset.Append;
    try
      for J := 0 to AttrNode.ChildNodes.Count - 1 do
        Dataset.Fields[J].Value := AttrNode.ChildNodes.Get(J).NodeValue;

      Dataset.Post;
    except
      Dataset.Cancel;
    end;
  end;
end;
它远不是完美的,但它给了你一幅图画。最后,我们需要将这一切结合在一起:

procedure TForm8.FillGrid;
var
  XMLDocument: TXMLDocument;
  i: Integer;
begin
  XMLDocument := TXMLDocument.Create(nil);
  XMLDocument.LoadFromFile(XMLFileName);
  XMLDocument.Active := True;

  DomToDataset(XMLDocument.DocumentElement, dxMemData1);
  FreeAndNil(XMLDocument);
  dxMemData1.Active := True;

  cxGrid1DBTableView1.DataController.CreateAllItems;
  for i := 0 to cxGrid1DBTableView1.ColumnCount - 1 do
    cxGrid1DBTableView1.Columns[i].ApplyBestFit();
end;

这是一个良好的开端。因为我没有您提供的信息,所以无法进一步了解。

Delphi附带了一个XML映射器工具,您可以使用该工具将XML转换为TClientDataSet可以使用的格式。然后,使用TXmlTransformProvider作为CD的输入,CD通过数据源将数据提供给cxGrid。这在OLH中都有详细的解释。StackOverflow是一个困难的社区。为什么人们(尤其是初学者)这么快就投了反对票,而不是帮助改进问题?@Dag改进你的问题,否则他们会关闭它。显示您拥有的代码并显示问题。@Dag是来自其他cxGrid的XML数据还是来自其他源的XML数据。顺便问一下,有德尔福吗version@dag在我再次收到你的信之前,我不会给你树立榜样,因为这可能是浪费时间。我的时间非常感谢你的回答,这很有帮助。非常感谢。
procedure TForm8.FillGrid;
var
  XMLDocument: TXMLDocument;
  i: Integer;
begin
  XMLDocument := TXMLDocument.Create(nil);
  XMLDocument.LoadFromFile(XMLFileName);
  XMLDocument.Active := True;

  DomToDataset(XMLDocument.DocumentElement, dxMemData1);
  FreeAndNil(XMLDocument);
  dxMemData1.Active := True;

  cxGrid1DBTableView1.DataController.CreateAllItems;
  for i := 0 to cxGrid1DBTableView1.ColumnCount - 1 do
    cxGrid1DBTableView1.Columns[i].ApplyBestFit();
end;