根据Empty XML示例合并缺少的XML记录

时间:2012-11-07 11:29:32

标签: c# .net xml

我有一个XML模板文件和以前保存的XML数据库记录:

  • XML文件 - 包含我想要的对象的所有当前字段 - 这可能随着时间的推移而变化
  • XML数据库记录 - 这是保存的XML。它可能与第一点中的XML不同,因为“模板”xml可能已更新为包含更多字段等。

一个例子将清除它..

我有一个“模板”xml,如下所示:

<dvd displayText="">
  <field id="txtTitle" displayText="true" required="true" type="textbox" width="100" label="DVD Title" />
  <field id="txtDescription" displayText="true" required="true" type="textbox" width="50" label="Your Description" />
</dvd>

这告诉UI在创建新记录时收集标题和描述。这非常有效。

因此,当我创建新的DVD记录时,它将向用户显示这两个字段并收集“标题”和“描述”值,并将值保存到SQL Server表中的XML字段中。

但我现在要做的是在模板xml中添加一个新的“字段”定义。我已经完成了这个..为了这个例子的目的,让我们将“PurchasedDate”字段定义添加到模板XML中。

<dvd displayText="">
  <field id="txtTitle" displayText="true" required="true" type="textbox" width="100" label="DVD Title" />
  <field id="txtDescription" displayText="true" required="true" type="textbox" width="50" label="Your Description" />
  <field id="txtPurchaseDate" displayText="true" required="true" type="textbox" width="50" label="Purchase Date" />
</dvd>

如果我正在创建一个新的DVD记录,我会被提示输入3个值;标题,描述,购买日期,因为模板XML中有什么。但是如果我回想起之前保存的DVD记录,它在XML中没有新的“购买日期”字段..

<dvd displayText="My DVD">
  <field id="txtTitle" displayText="true" required="true" type="textbox" width="100" label="DVD Title">My Movie DVD</field>
  <field id="txtDescription" displayText="true" required="true" type="textbox" width="50" label="Your Description">This movie is awesome</field>
</dvd>

所以我想要做的是获取保存在数据库中的XML(如上所示),比较或合并模板XML文件中任何缺少的“字段”定义..最后得到以下内容:

<dvd displayText="My DVD">
  <field id="txtTitle" displayText="true" required="true" type="textbox" width="100" label="DVD Title">My Movie DVD</field>
  <field id="txtDescription" displayText="true" required="true" type="textbox" width="50" label="Your Description">This movie is awesome</field>
  <field id="txtPurchaseDate" displayText="true" required="true" type="textbox" width="50" label="Purchase Date" />
</dvd>

我正在使用Linq从数据库中获取现有记录的值(如果存在)。 我正在做一个XmlDocument.LoadXml(xmlstring)或XmlDocument.Load(filename),具体取决于它的新记录还是现有记录。

然后我想采用XmlDocument并将模板合并到其中以生成上面的XML输出以便在屏幕上显示。

如果有比使用XmlDocuments更好的方法,请告诉我。我很乐意去研究它然后再使用它。

我正在使用C#...

非常感谢..

1 个答案:

答案 0 :(得分:1)

您的解决方案存在巨大的冗余问题,如果您改变其中一个字段的显示文本或更改必填字段,您将面临类似的问题。

我会将元数据与实际数据分开,即保留一条描述字段的记录:

<dvd displayText="">
  <field id="txtTitle" displayText="true" required="true" type="textbox" width="100" label="DVD Title" />
  <field id="txtDescription" displayText="true" required="true" type="textbox" width="50" label="Your Description" />
  <field id="txtPurchaseDate" displayText="true" required="true" type="textbox" width="50" label="Purchase Date" />
</dvd>

将数据记录剥离到字段ID和值:

<dvd displayText="A movie">
  <field id="txtTitle">Some title</field>
  <field id="txtDescription">Some description</field>
  <field id="txtPurchaseDate">2012-12-21</field>
</dvd>

使用meta xml找出可以加载的字段,并从已剥离的xml中获取值。

否则,每次记录布局更改时,您都需要同步所有数据。