C# 基于空XML示例合并丢失的XML记录
C# 基于空XML示例合并丢失的XML记录,c#,.net,xml,C#,.net,Xml,我有一个XML模板文件和以前保存的XML数据库记录:
XML文件-包含一个对象所需的所有当前字段-随着时间的推移,添加的项目可能会发生变化
XML数据库记录-这是保存的XML。它可能与第一点中的XML不同,因为“模板”XML可能已更新,以包含更多字段等
举个例子可以说明这一点
我有一个“模板”xml,如下所示:
<dvd displayText="">
<field id="txtTitle" displayText="true" required="true" typ
我有一个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记录时,它将向用户显示这两个字段,收集“Title”和“Description”值,并将值保存到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>
我的电影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>
我的电影DVD
这部电影太棒了
我使用Linq从数据库中现有记录(如果存在)中获取值。
我目前正在做一个XmlDocument.LoadXml(xmlstring)或XmlDocument.Load(filename),这取决于它是新记录还是现有记录
然后,我想获取XmlDocument并将模板合并到其中,以生成上面的XML输出,并在屏幕上显示
如果有比使用XmlDocuments更好的方法,请告诉我。。我很乐意去研究它,然后使用它
我用的是C#
非常感谢。您的解决方案存在巨大的冗余问题,例如,如果您更改其中一个字段的显示文本或更改所需字段,您将面临类似的问题
我会将元数据与实际数据分开,即保留一条描述字段的记录:
<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>
一些头衔
一些描述
2012-12-21
使用元xml确定哪些字段可以加载并从精简的xml中获取值
否则,每次更改记录布局时,您都需要同步所有数据。谢谢Tommy,这是一条很好的建议。。我是否可以找出元数据中缺少的内容,并将这些字段添加到实际数据中。。。我是否需要循环检查元数据字段并测试数据以查看每个字段是否存在。?这取决于你的应用程序。真的,使用元数据找出哪些数据字段是可能的,使用此信息对数据运行查询,如果字段缺失,LINQ将给你空/空结果。根据您的应用程序,您可以允许某些字段丢失并进行处理,也可以在添加或删除字段(或组合)时更新数据记录