【发布时间】:2017-03-01 21:09:11
【问题描述】:
我有一个包含嵌套表的现有 XML 文档。我想打开它,读入并修改结构(即添加或删除列/字段)。忽略嵌套表,这是一个完整的 XML 测试文档:
<DATAPACKET Version="2.0">
<METADATA>
<FIELDS>
<FIELD attrname="StringField" fieldtype="string" WIDTH="20" />
<FIELD attrname="IntField" fieldtype="i4" />
</FIELDS>
<PARAMS CHANGE_LOG="1 0 4 2 0 4" />
</METADATA>
<ROWDATA>
<ROW RowState="4" StringField="String" IntField="234" />
<ROW RowState="4" StringField="234" IntField="24" />
</ROWDATA>
</DATAPACKET>
以下代码在打开时抛出未找到“testField”的异常,可能是因为它在基础 XML 文件中不存在。
ClientDataSet1.Close;
with TStringField.Create(ClientDataSet1) do
begin
FieldName := 'testField';
DataSet := ClientDataSet1;
end;
with ClientDataSet1 do
begin
CreateDataSet;
Open;
end;
如果我添加:
with ClientDataSet1 do
begin
FieldDefs.Clear;
Fields.Clear;
end;
不会引发异常,但前两个字段会消失,除非我输入一些数据,否则新结构不会写入 XML doc 文件。
<DATAPACKET Version="2.0">
<METADATA>
<FIELDS>
<FIELD attrname="testField" fieldtype="string" WIDTH="20" />
</FIELDS>
<PARAMS CHANGE_LOG="1 0 4" />
</METADATA>
<ROWDATA>
<ROW RowState="4" testField="12321" />
</ROWDATA>
</DATAPACKET>
是否有标准或推荐的方法可以在不丢失数据的情况下向现有 XML 文档添加字段?
干杯, 制革商
【问题讨论】:
-
嗯,这取决于。有很多选择。
-
您应该在您的 q 中添加一个完整 XML 文档的最小示例,包括您添加的字段。如果操作正确,这种 XML 修改通常不会出现问题,但您需要清除 CDS 上的所有持久 TField 和 TFieldDef,否则您很可能会收到报告的错误。
-
并且无论如何,请保持最小,例如仅使用两个字段的单个测试数据集。不要发布包含 30 列和 500 条记录的整个海量 XML 数据集。
-
大卫,比如....?
-
MartynA,我明天将尝试清除持久性字段和定义。谢谢。您可以提供任何链接作为示例吗?我遇到的所有似乎都是针对新的 XMLdocs,而不是扩展现有的。
标签: xml delphi xml-parsing tclientdataset