Подход к извлечению значений XML внутренней схемы для сопоставления с входящей схемой оркестрации

Существует несколько прикладных систем, которые передают друг другу сообщения в рамках своего рабочего процесса. Из-за технических ограничений, регулирующих целостность транзакций, данные приложения и доставка сообщений фиксируются в единой базе данных DB2 мэйнфрейма. Сообщения не передаются напрямую на сервер BizTalk (2006 R2); Позже BTS может извлечь сообщение из базы данных DB2.

Таблица очереди сообщений в базе данных DB2 имеет несколько полей. Ключевое поле - столбец MESSAGE_DATA - собственно сообщение; это сам XML-контент. Когда вы используете адаптер DB2 для запроса записей из таблицы, входящая схема будет иметь вид

ИСПРАВЛЕНИЕ ОБНОВЛЕНИЕ: схема DB2Message основана на атрибутах; Раньше я ошибочно принял его за элементарный.

<DB2Message MESSAGE_DATA="&lt;InternalXML&gt; ........ &lt;/InternalXML&gt;"
 MESSAGE_DATE="2008-1-1 00:00:00" MESSAGE_ID="GUID" TXN_ID="GUID" .... other attrib />

Оркестровка использует схему

<EAIMessage>
 <Header>
  <ServiceID>
  <MessageID>
  ....
  <Mode>
 </Header>
 <Body>
  <RawXML>
 </Body>
</EAIMessage>

Оркестровка будет использовать несколько продвинутых полей в заголовке для принятия решений о маршрутизации и обработке. Дело в том, что эти поля заголовка на самом деле поступают из содержимого внутреннего XML, хранящегося в MESSAGE_DATA DB2Message.

На этом единственном уровне Mapper ничего не знает об этой базовой XML-схеме внутри MESSAGE_DATA, когда объединяет две схемы вместе. Вероятно, должен быть какой-то функтоид XPath, который может дополнительно детализировать элемент MESSAGET_DATA для правильного сопоставления значений, но, поскольку я раньше не имел дело с обширными приложениями XML и XSLT, я не могу увидеть доступные функции, которые могут помочь мне выполнить эту задачу. .

Кто-нибудь раньше делал такое извлечение данных и отображение?

ОБНОВИТЬ. По запросу внутренний XML-код MESSAGE_DATA может выглядеть как

<Message>
    <Id>e86970f4-0455-4535-8e65-a06eb7aaef8a</Id>
    <SenderApp>999</SenderApp>
    <ReceiverApp>2000</ReceiverApp>
    <ServiceId>8798973454</ServiceId>
    <Mode>P</Mode>
    <MuxId></MuxId>
    <ExceptionCode></ExceptionCode>
    <ExceptionMessage></ExceptionMessage>
    <Body>
        <WorkItem xmlns="http://tempuri.org/WorkItem.xsd">
            <ServiceHeader xmlns="http://tempuri.org/Service.xsd">
                <ID_UPDATED_BY>username</ID_UPDATED_BY>
                <ID_HISTORY_REF>xxxxxxx</ID_HISTORY_REF>
                <SESSION_ID>sessionID</SESSION_ID>
                <DT_LAST_UPDATE>timestamp</DT_LAST_UPDATE>
                <TM_LAST_UPDATE>time</TM_LAST_UPDATE>
            </ServiceHeader>
        </WorkItem>
    </Body>
</Message>

person icelava    schedule 01.11.2008    source источник
comment
Обновлена ​​запрашиваемая схема DB2, чтобы она была основана на атрибутах, а не на элементах.   -  person icelava    schedule 05.11.2008


Ответы (2)


Крис прав - похоже, это только внутренняя часть сообщения, которое вас действительно волнует, а внешняя часть - это просто конверт.

Таким образом, я предлагаю вам создать дизассемблер, который в конвейере приема будет вырезать конверт (вы можете сохранить его целиком как свойство контекста и / или извлечь из него некоторые биты как отдельные свойства, если вам нужно действовать на них) и извлеките внутреннюю часть, которая станет сообщением, опубликованным в окне сообщения.

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

Теперь у вас есть полный доступ к сообщению и его свойствам; если возможно, вы можете развернуть схему для этого сообщения, которая могла бы иметь отличительные свойства, которые предоставили бы вам быстрый доступ к некоторым узлам (простого типа). в качестве альтернативы вы можете использовать xlang / s xpath для извлечения информации.

Если ваше встроенное сообщение было внутри элемента в конверте, вы, безусловно, могли бы использовать встроенный XmlDisassembler для всего этого (вам просто нужно правильно развернуть свои схемы и соответствующим образом настроить компонент; я не уверен, насколько хорошо это работает с сообщение, содержащееся в атрибуте, но, вероятно, стоит попробовать.

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

person Yossi Dahan    schedule 06.12.2008

Я бы посоветовал изучить схемы конвертов, чтобы «развернуть» внутреннее сообщение из внешнего сообщения. Я считаю, что конверт может продвигать свойства из конверта во внутренний контекст сообщения, когда он перемещается по конвейеру приема. Затем внутреннему сообщению необходимо будет сопоставить схему своего собственного типа. После этого вы сможете маршрутизировать или принимать решения на основе типа схемы и использовать XPath для выбора того, что вам нужно. Я не пробовал все это, но я уверен, что для этого существует функция.

person Christian Loris    schedule 05.12.2008