繁体   English   中英

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

[英]How to handle multiple XML versions gracefully

我有一个从订购消息开始的场景。 随着时间的流逝,消息可能会被修改(分为不同的版本)。 什么是查看消息的版本并将其传递给适当的处理机制的好方法? 我可以看一下版本(始终会有一个带有版本信息的标头,等等),然后使用一种情况将其发送到适当的解析器(当前使用LINQ to XML)。 但是,这似乎不是很优雅。 特别是如果我们有10个版本需要支持。

什么都没冒出来……我只是想看看别人会怎么做。

多个解析器

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

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

这并不妨碍您在版本之间共享部分代码,并且将解析分解为各个组成部分以支持这一点是一个好主意。 您可以通过类或方法将其分解。

您可能有一个通用的基本接口来开始解析任何版本,并获取XML表示的对象图。 理想情况下,生成的对象模型应尽可能独立于版本,以便您可以共享通用功能。

升级资料

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

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

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

您仍然需要一个开关:)

如果您的版本是数字,则可能会有类似公共接口的命令IOrderMessageHandler {void Handle(OrderMessage message); }

public class OrderMessageHandlerVersion123 : IOrderMessageHandler { ... }

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

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

一种替代解决方案是使用一组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传递给处理方法。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM