簡體   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