Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
是否可以将记录保存到XML文件而不单独保存字段?_Xml_Delphi_Record - Fatal编程技术网

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

是否可以将记录保存到XML文件而不单独保存字段?,xml,delphi,record,Xml,Delphi,Record,我有一个很大的记录,它由许多不同类型的字段和动态数组组成。我想把它保存到一个文件中,然后再读回。想象一下这个简单的记录: TCustomRecord = Record Field1 : array of integer; Field2 : Integer; Field3 : String; end; TMyData = record Name:String; Age:Integer; Money:Double

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

TCustomRecord = Record
   Field1 : array of integer;
   Field2  : Integer;
   Field3 : String;
end;
TMyData = record
           Name:String;
           Age:Integer;
           Money:Double;
end;
通常,我必须使用类似的方法将此记录保存到文件中:

var
   f : File of TCustomRecord;
   cr : TCustomeRecord;
 begin
   Write(f, cr);
 end;
但由于动态数组和字符串类型的原因,它无法工作

因此,问题是:

是否有一种方法可以将其保存(导出)到
TXMLDocument
,而无需查看所有字段?(我的意思是使用
addChild()
)逐字段添加)

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

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

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

下面是一个示例记录:

TCustomRecord = Record
   Field1 : array of integer;
   Field2  : Integer;
   Field3 : String;
end;
TMyData = record
           Name:String;
           Age:Integer;
           Money:Double;
end;
如果您根本不想调用AddChild,您可以只写入属性,生成一个如下实体:

  <MyData  Name="Warren" Age="48" Money="100.00"   />

没有人说您甚至必须使用子节点:

  <MyData> 
    <Name>Warren</Name>
    <Age>48</Age>
    <Money>100.00<Money/>
  </MyData>

沃伦
48
100

因此,在我看来,您正在避免这样一个事实,即XML提供了很多方法来实现这些操作,而类似MSXML DOM的API提供了多种方法来将任何记录映射到文件。

您的XML库显然需要知道字段的值是什么,否则它无法序列化这些字段,因此您必须“遍历所有字段”在某个时刻。无论您是手动执行,还是采用某种方式自动遍历数据结构(如RTTI),都没有区别。必须检查所有字段。

你说的“记录”是什么意思?@Chris:他指的是
record
变量。我仍然不知道他在问什么。弗洛姆-试着更清楚地问你的问题?这太模糊了,我不知道你在问什么。也许他在寻求一种方法来自动将基于RTTI的数据流传输到xml,而无需“通过”(编写代码)来生成xml?Flom,将“xml文件”更改为“TXMLDocument”并没有真正澄清您的问题。我假设你的问题的解决方案会让你避免写一些代码;你能举一个你希望避免的代码类型的例子吗?你能给出一些假设性的代码来代替你现在所拥有的吗?很抱歉问得含糊不清。我已经编辑了这个问题。希望它能澄清问题。如果记录的大小是固定的,有一种方法。您可以将其作为Base64编码的字节块写入。Mime64编码的二进制数据作为XML文件。哇——)哇,不,@Runner,那不是真的。记录的大小总是固定的。但是记录有动态数组和字符串。存储这些值只会得到地址,一旦当前进程退出或字段被修改,这些地址就没用了。在弗洛姆解释这个问题的真正含义之前,我之前的回答解释了为什么即使记录中没有引用类型,你的建议仍然是个坏主意。(不管是64垒还是其他的都无关紧要。)@Warren,这有什么奇怪的。如何将图像序列化为XML节点。将其序列化为Base64编码的字节流。这里出了什么问题。我想你知道我的意思。不要吹毛求疵。例如,如果记录中有一个固定大小的字段(例如32位整数),则可以将记录写入32字节的二进制数据。然后以同样的方式读回来。这与将记录流化为流的原理相同。是的,如果你有动态数据,你不能这样做。这就是为什么我写道记录的大小必须固定。我看这里没有什么问题。