处理XML Schema更改而无需更改代码

时间:2012-06-11 18:47:47

标签: c# xsd linq-to-xml linq-to-xsd

目前我们有一个XML Schema,代码读取xml文件,验证模式并保存到数据库。将来会有架构更改,代码如何处理它们而无需重写新架构的代码。

谢谢,

让我举个例子

<Products>
   <product id="1">
      <name> ABC </name>
      <desc> good one </desc>
   </product>
</products>

XPath映射配置

Table      Column     XPath
Product    id         //Products/product/id
Product    name       //Products/product/name
Product    desc       //Products/product/desc

现在C#代码读取id,name和desc,并根据Mapping configuraiton生成一个insert语句

如果架构发生更改并添加了新元素,则说明价格,我们会将该价格添加到映射中,因此生成的新插入语句包含价格。

这会有用吗?

3 个答案:

答案 0 :(得分:1)

处理类似这样的事情的方法是立即想到的是拥有一个已知的良好的骨架XML模式,其中没有数据,让代码解析并学习该模式,然后让它在任意输入上运行给它。当XML模式发生变化时,只需让受信任的用户/管理员进入并更改已知的良好骨架。

您应该确保您的数据库可以在没有任何额外刺激的情况下处理这些更改,并且您肯定应该至少有一些定期运行的测试,并在检测到问题时抛出警报。像这样的“低维护”过程中最危险的因素之一就是它们经常会安静地失败而且没有办法说它们已经坏了!

我有点害怕我没有得到你的整个问题,因为你添加了一堆显然不在你问题中的标签,但希望这会有所帮助。

答案 1 :(得分:1)

如果XML数据的位置发生变化,除非您想从XML文件中抽象出废话(在文档中包含元数据描述在哪里查找内容),否则您将失去运气。如果您的数据元素始终位于同一位置,您所要做的就是将XSD文件保存为单独的文件,并在必要时进行更改以验证文档。

答案 2 :(得分:1)

我讨厌解析XML并将其加载到对象中。因此,您可以尝试以下方法。

创建一个C#对象,表示您正在谈论的XML数据。序列化C#类,并且中提琴你有一个强类型的XML模式。此外,如果将来需要进行其他模式更改,只需修改C#类并重新序列化即可完成设置。

这也消除了解析XML文档的需要(假设您在CLR中使用它),因为您可以简单地引用C#类,并且可以将其反序列化回内存而无需任何解析。