处理 XML 更改的好方法

Posted

技术标签:

【中文标题】处理 XML 更改的好方法【英文标题】:Good Way To Handle XML Change 【发布时间】:2011-01-14 12:29:09 【问题描述】:

我们的系统将 XML 字符串存储在数据库中。我最近不得不更改一个类的属性,现在当一个 XML 字符串被反序列化时,它会抛出一个异常。处理这种变化的最佳方法是什么?使用 XPATH 或 LINQ 在应用程序代码中查找节点,或更改 sql 数据库中的 xml 字符串(即进行批量更新)?

【问题讨论】:

【参考方案1】:

您可能希望编写一个自定义 XML 反序列化器(即实现 IXmlSerializable,请参阅 here)来处理 XML 中的更改。如果您已投入大量时间来制作 XML 序列化属性,则可能需要考虑另一种方法。

考虑批量升级您的 XML,或弃用(而不是删除)类中的属性并将旧行为映射到新行为。

从长远来看,您将来会想出一个解决此问题的策略,因为您很可能会在添加/更改系统功能时继续对架构/对象定义进行更改。

【讨论】:

【参考方案2】:

如果您将对象序列化到数据库,您可以尝试我概述的方法here 将旧版本加载到新版本中,然后在您保存新版本时将被保存。不确定是否适合使用不同版本的课程...

基本上,您创建一个工厂来从 xml 生成您的对象。每次更改对象时,都会创建一个新工厂和一个新对象类,它在其构造函数中被赋予旧类的一个版本,并从旧类创建自己。新工厂尝试从 xml 创建一个新对象,如果可以的话,祝你幸福,如果不能,那么它会创建一个新对象并告诉下一个最旧的工厂从 xml 创建下一个最旧的对象。然后可以将这些工厂链接在一起,以便您始终可以从数据库中的任何数据加载对象的最新版本。

这假设总是可以从 v1 对象创建有效的 v2 对象。

【讨论】:

【参考方案3】:

将版本存储在您的 XML 字符串中是一种很好的做法。在数据库级别或类级别,以便您的代码知道它必须反序列化哪个版本的类。

您还可以查看 XSLT。它允许您将一个版本的 XML 转换为另一个版本。 在这种情况下,从一个版本到另一个版本的逻辑不是由代码处理,而是由 XSLT 处理。您甚至可以将 XSLT 存储到数据库中,使其可供其他程序重用。

【讨论】:

存储版本号的好主意。

以上是关于处理 XML 更改的好方法的主要内容,如果未能解决你的问题,请参考以下文章

用户更改密码时调用哪个 Windows API?挂钩这个 API 的好方法是啥?

什么是延迟api调用的好方法?

检测值已返回到低于阈值,然后允许更改值

在 Java 中更改 XML 文件中的一个值的最佳方法是啥?

重新加载一批 UICollectionView 或 UITableView 更改的好算法?

通过xml更改切换按钮文本颜色