是否可以将记录保存到XML文件而不单独保存字段?

Mah*_*00d 7 xml delphi record

我有一个很大的记录,包括许多不同类型的字段和动态数组.我想将它保存到文件然后再读回来.想象一下这个简单的记录:

TCustomRecord = Record
   Field1 : array of integer;
   Field2  : Integer;
   Field3 : String;
end;
Run Code Online (Sandbox Code Playgroud)

通常我必须使用这样的东西将此记录保存到文件中:

var
   f : File of TCustomRecord;
   cr : TCustomeRecord;
 begin
   Write(f, cr);
 end;
Run Code Online (Sandbox Code Playgroud)

但由于动态数组和字符串类型,它不起作用.

所以问题是:

有没有办法将它保存(导出)到一个TXMLDocument不经过所有字段?(我的意思是逐个字段添加addChild())

War*_* P 1

我会谨慎地说“不”,尽管我不知道你所说的“遍历所有领域”是什么意思。

另一个答案链接到使用 RTTI 迭代记录中的字段的可行方法。然后,您必须确保您的记录不会使用 RTTI 迭代器代码无法理解的任何类型,否则它将不会被保存。

至于“不必自己调用 AddChild”,您可以简单地将所有内容存储在 XML 属性中,而不需要任何子节点。我不知道您是否知道这一点,但将记录中的字段映射到可能产生的 XML 内容的方法不止一种。

这是一个示例记录:

TMyData = record
           Name:String;
           Age:Integer;
           Money:Double;
end;
Run Code Online (Sandbox Code Playgroud)

如果您根本不想调用 AddChild,您可以只写入属性,生成一个如下所示的实体:

  <MyData  Name="Warren" Age="48" Money="100.00"   />
Run Code Online (Sandbox Code Playgroud)

没有人说你必须使用子节点:

  <MyData> 
    <Name>Warren</Name>
    <Age>48</Age>
    <Money>100.00<Money/>
  </MyData>
Run Code Online (Sandbox Code Playgroud)

因此,在我看来,您似乎在回避这样一个事实:XML 为您提供了多种执行这些操作的方法,并且类似 API 的 MSXML DOM 为您提供了不止一种将任何记录映射到文件的方法。