数据绑定向导和XML片段

时间:2014-01-07 17:43:02

标签: xml delphi data-binding

我希望这是一个简单的问题,但我看不到树木的木材。

前一段时间使用Delphi XML数据绑定向导为分层数据集创建了一大堆接口和类。从XML流中读取和写入整个数据集效果很好。

但现在我希望能够流式传输数据集的各个片段。根据任何DTD为此目的是否有效并不重要。我只想要一种方法来复制应用程序中数据集的各个片段,并重用现有的XML流似乎是一个好主意。通过片段,我的意思是选择数据集中的兄弟节点(字面意思是树视图中的选定节点)及其所有子节点。

为了说明,要为数据集中的每种不同类型的对象流式传输我当前拥有的整个数据集,请使用以下方法:

procedure TPerson.Save(aXmlNode : IXMLNode);
var
  person : IXMLPersonType;
begin
  person := aXmlNode as IXMLPersonType;

  person.SetRate(fRate);

  for index := 0 to fTasks.Count - 1 do
  begin
    fTasks[index].Save(person.GetTasks.Add);
  end;

并全力以赴:

procedure TProject.SaveProject;
var
  project : IXMLProjectType;
begin
  project := NewProject;
  Save(project);

如果您以前使用过数据绑定向导,那么所有非常标准的东西(我希望)。

我现在无法理解的是,如果我只想保存特定的TPerson个对象列表而不是整个项目,那么如何解决问题。我在哪里抓住IXMLNode进入TPerson.Save?我迷失在由向导生成的界面和类的迷宫中。

我还没有读回XML,但还有其他问题我需要担心或者这一点是否明显?

(顺便说一句,我很高兴(ish)回答说数据绑定向导不打算与XML片段一起使用,所以不要这样做 - 如果确实如此。)

1 个答案:

答案 0 :(得分:1)

AFAIK,没有直接支持这种操作,但你可以这样做(假设iPerson代表片段的根元素):

var
  iPerson: IXMLNode;
  iFragment: IXMLNode;
  iNewDoc: IXMLDocument;
begin
  ...
  iFragment := iPerson.CloneNode(True);  // deep copy
  iNewDoc := NewXMLDocument;
  iNewDoc.DocumentElement := iFragment;
  iNewDoc.SaveToFile('C:\...\fragment.xml');
  ...

更新:使用必需的根元素保存多个兄弟姐妹,例如像这样:

iNewDoc := NewXMLDocument; 
iRoot := iNewDOC.CreateElement('persons',TargetNamespace); 
iNewDoc.DocumentElement := iRoot; 
for (...) do 
  begin 
    iFragment := iPersons.ChildNodes[i].CloneNode(True); // deep copy 
    iRoot.ChildNodes.Add(iFragment); 
  end; 
iNewDoc.SaveToFile('C:\...\siblings.xml');