如何优雅地处理多个XML版本

时间:2011-12-12 14:50:55

标签: c# linq-to-xml

我有一个场景,我开始使用订单消息。随着时间的推移,可以修改消息(到不同的版本)。查看消息的版本并将其传递给适当的处理机制会有什么好方法?我可以查看版本(将始终有一个带有版本信息的标题等),然后使用一个案例将其发送到正确的解析器(目前使用LINQ to XML)。但是,这似乎并不优雅。特别是如果我们需要支持10个版本。

没有任何东西突然出现在我身上......只是想看看其他人会如何接近这一点。

3 个答案:

答案 0 :(得分:1)

多个解析器

如果你有X版本的架构,你需要X代码路径来处理它们。

要选择你的实现,你必须在某处有一个switch语句。该开关可以简单地调用方法,也可以在工厂方法中返回正确的解析器(类或委托)。

这并不妨碍您在版本之间共享部分代码,最好将解析分解为其组件部分以支持此功能。你可以通过课程或方法将它们分解。

您可以使用一个公共基本接口来启动解析任何版本,并获取XML所代表的对象图。理想情况下,生成的对象模型应尽可能与版本无关,以便您可以共享通用功能。

升级数据

或者,您可以使用XSLT升级数据,并且只使用一个解析器。

您可以为每个版本实现一次并链接所有转换,也可以直接转换为最新版本,并在每个版本中修改以前版本的转换。

链接转换具有更好的维护成本。直接变换有更好的性能。

你还需要一个开关:)

答案 1 :(得分:1)

如果你的版本是一个数字,你可以有类似的东西     public interface IOrderMessageHandler {         void Handle(OrderMessage消息);     }

public class OrderMessageHandlerVersion123 : IOrderMessageHandler { ... }

具有命名约定并使用反射构造它们:

var handler = (IOrderMessageHandler)Activator.CreateInstance( GetType().Assembly.GetType("MyNamespace.OrderMessageHandlerVersion" + message.Version));
handler.Handle(message)

答案 2 :(得分:1)

另一种解决方案是使用一组xslt脚本,它们将旧版本的xml转换为最新版本(通过顺序应用脚本将版本N-1转换为版本N)。在这种情况下,您将只有一个“处理机制”,它只支持最新版本的XML。

处理机制如下:

  1. 接收XML
  2. 从XML中读取版本(假设版本为1.0)
  3. 使用XSLT脚本将XML转换为最新版本(假设最新版本为4.0)。转换应如下所示:1.0 - > 2.0,2.0 - > 3.0,3.0 - > 4.0。
  4. 将转换后的XML传递给处理方法。