Как правильно обрабатывать несколько версий XML - PullRequest
0 голосов
/ 12 декабря 2011

У меня есть сценарий, в котором я начинаю с сообщения заказа. Со временем сообщение может быть изменено (в разные версии). Какой будет хороший подход, чтобы увидеть, какая версия сообщения, и передать его соответствующему механизму обработки? Я мог бы посмотреть на версию (всегда будет иметь заголовок с информацией о версии и т. Д.), А затем использовать регистр для отправки его соответствующему анализатору (в настоящее время использующему LINQ to XML). Тем не менее, это не выглядит очень элегантно. Особенно, если у нас около 10 версий, которые мы должны поддерживать.

Мне ничего не показалось ... просто хотелось посмотреть, как к этому подойдут другие.

Ответы [ 3 ]

1 голос
/ 12 декабря 2011

Если ваша версия является числом, вы можете иметь что-то вроде открытый интерфейс IOrderMessageHandler { void Handle (сообщение OrderMessage); }

public class OrderMessageHandlerVersion123 : IOrderMessageHandler { ... }

имеет соглашение об именах и строит их, используя отражение:

var handler = (IOrderMessageHandler)Activator.CreateInstance( GetType().Assembly.GetType("MyNamespace.OrderMessageHandlerVersion" + message.Version));
handler.Handle(message)
1 голос
/ 12 декабря 2011

Альтернативным решением является использование набора сценариев 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 в метод обработки.
1 голос
/ 12 декабря 2011

Несколько парсеров

Если у вас есть X-версии схемы, вам потребуется X-кодовые пути для их обработки.

Чтобы выбрать вашу реализацию, вам понадобится где-то оператор switch. Этот переключатель может просто вызывать методы, или это может быть метод фабрики, который возвращает правильный анализатор (класс или делегат).

Это не мешает вам делиться частями вашего кода между версиями, и это хорошая идея разбить ваш синтаксический анализ на его составные части, чтобы поддержать это. Вы можете разбить их на классы или методы.

У вас может быть общий базовый интерфейс для запуска любой версии и возврата графа объектов, который представляет XML. Получающаяся в результате объектная модель в идеале должна быть максимально независимой от версии, чтобы вы могли совместно использовать общие функциональные возможности.

Обновление данных

В качестве альтернативы вы можете использовать XSLT для обновления данных и использовать только один анализатор.

Вы можете либо реализовать это один раз для каждой версии и объединить все преобразования в цепочку, либо вы можете преобразовать напрямую в последнюю версию и изменять преобразования предыдущей версии с каждым выпуском.

Цепные преобразования имеют лучшую стоимость обслуживания. Прямое преобразование имеет лучшую производительность.

Для этого вам все еще понадобится переключатель:)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...