如何优雅地处理多个XML版本
本文关键字:XML 版本 处理 何优雅 | 更新日期: 2023-09-27 18:17:40
我有一个场景,我从订单消息开始。随着时间的推移,消息可能会被修改(变成不同的版本)。查看消息的版本并将其传递给适当的处理机制的好方法是什么?我可以看看版本(将始终有一个标题与版本信息等),然后使用一个案例将其发送到适当的解析器(目前使用LINQ到XML)。然而,这似乎不是很优雅。特别是当我们需要支持10个版本时。
我什么都想不出来…我只是想看看其他人会怎么做。
多个解析器
如果你有X个版本的模式,你将需要X个代码路径来处理它们。
要选择你的实现,你必须在某处有一个switch语句。该开关可以简单地调用方法,也可以在返回正确解析器(类或委托)的工厂方法中。
这并不妨碍您在不同版本之间共享部分代码,为了支持这一点,将您的解析分解为其组成部分是个好主意。您可以通过类或方法来分解它们。
您可以有一个公共基础接口来开始解析任何版本,并返回XML表示的对象图。理想情况下,生成的对象模型应该尽可能与版本无关,以便您可以共享公共功能。
升级数据也可以使用XSLT来升级数据,并且只使用一个解析器。
您可以为每个版本实现一次并链接所有转换,或者您可以直接转换到最新版本并在每个版本中修改以前版本的转换。
链接变换具有更好的维护成本。直接变换效果更好。
你仍然需要一个开关:)
如果你的版本是一个数字,你可以像这样公共接口IOrderMessageHandlervoid Handle(OrderMessage消息);}
public class OrderMessageHandlerVersion123 : IOrderMessageHandler { ... }
具有命名约定并使用反射构造它们:
var handler = (IOrderMessageHandler)Activator.CreateInstance( GetType().Assembly.GetType("MyNamespace.OrderMessageHandlerVersion" + message.Version));
handler.Handle(message)
另一种解决方案是使用一组xslt脚本将旧版本的xml转换为最新版本的xml(通过顺序应用将版本N-1转换为版本N的脚本)。在这种情况下,您将只有一个"处理机制",它只支持最新版本的xml。
处理机制如下:
- 接收XML
- 从XML读取版本(假设版本是1.0) 使用XSLT脚本将XML转换为最新版本(假设最新版本是4.0)。转换应该像这样:1.0 -> 2.0,2.0 -> 3.0,3.0 -> 4.0。
- 将转换后的XML传递给处理方法