基于 Empty XML 示例合并丢失的 XML 记录

Posted

技术标签:

【中文标题】基于 Empty XML 示例合并丢失的 XML 记录【英文标题】:Merge missing XML records based on Empty XML example 【发布时间】:2012-11-07 11:29:32 【问题描述】:

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

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

举个例子就明白了..

我有一个看起来像这样的“模板”xml:

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

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

但我现在要做的是向模板 xml 添加一个新的“字段”定义。我已经这样做了.. 就本示例而言,让我们将“PurchasedDate”字段定义添加到模板 XML。

如果我正在创建新的 DVD 记录,系统会提示我输入 3 个值;标题、描述、购买日期,因为那是模板 XML 中的内容。但如果我回想以前保存的 DVD 记录,它在 XML 中没有新的“购买日期”字段。

我的电影 DVD这部电影很棒

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

我的电影 DVD这部电影很棒

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

然后我想获取 XmlDocument 并将模板合并到其中以生成上述 XML 输出以显示在屏幕上。

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

我正在使用 C#...

非常感谢..

【问题讨论】:

【参考方案1】:

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

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

<dvd displayText="">
  <field id="txtTitle" displayText="true" required="true" type="textbox"  label="DVD Title" />
  <field id="txtDescription" displayText="true" required="true" type="textbox"  label="Your Description" />
  <field id="txtPurchaseDate" displayText="true" required="true" type="textbox"  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>

使用元 xml 来确定可以加载哪些字段并从精简的 xml 中获取值。

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

【讨论】:

谢谢 Tommy,这是一个很好的建议。我是否会去找出元数据中缺少的内容并将这些字段添加到实际数据中...我是否需要遍历元数据字段并测试数据以查看每个字段是否存在..?? 这真的取决于你的应用程序,使用元数据找出可能的数据字段,使用此信息对数据运行查询,如果字段是,LINQ 会给你空/空结果失踪。根据您的应用,您要么允许某些字段丢失并处理它,要么在添加或删除字段(或组合)时更新您的数据记录

以上是关于基于 Empty XML 示例合并丢失的 XML 记录的主要内容,如果未能解决你的问题,请参考以下文章

将多个xml合并为一个

转换分层 DOM 树 XML 文件:XSLT 能否转换为“扁平化”XML 文件而不会丢失数据?

XSLT:一种合并 xml 文件的简单方法

使用 XSLT 将具有相同 ID 的元素 (XML) 合并到 txt 文件

将空 XML 元素反序列化为 Guid.Empty

Spring任务调度之SpringTask基于XML和基于注解的使用示例