Biztalk получает ошибку NullPartException при использовании xpath

Профиль: Biztalk 2009, обновление 4 на Windows 2008 Server SP2 (платформа для разработки) Привет, при использовании xpath для сопоставления моего вывода с использованием конструкции сообщения и назначения сообщения со следующим кодом:

    sXPath = System.String.Format("/*[local-name()='ProcessSalesOrder' and namespace-uri()='http://www.TestSchemas.net/TestSchemas_V2_2/schemas']/*[local-name()='header' and namespace-uri()='http://www.TestSchemas.net/TestSchemas_V2_2/schemas']/*[local-name()='detail' and namespace-uri()='http://www.TestSchemas.net/TestSchemas_V2_2/schemas' and position()={0}]", nLoopCount);
    System.Diagnostics.Debug.WriteLine(sXPath);
    SingleInput = xpath(Input, sXPath);

Я получаю исключение в средстве просмотра событий;

    Exception thrown from: segment 1, progress 15
    Inner exception: The part 'part' of message 'SingleInput' contained a null value at the end of the construct block.

    Exception type: NullPartException
    Source: Microsoft.XLANGs.Engine
    Target Site: Void ConstructionCompleteEvent(Boolean)

У меня есть простая оркестровка с одним портом приема и одним портом отправки с использованием двух схем. Я получаю количество записей неограниченной «подробности» в переменную с именем nRecordCount и использую счетчик циклов в MessageLoop для увеличения этого значения, помещенного в конец объекта Expression с nLoopCount = nLoopCount + 1; в качестве выражения.

Оркестровка

Подробная структура 2-й схемы (имя: SalesOrderDetail_V2_2.xsd) такая же, как и 1-й (имя: SalesOrderRequest_V2_2.xsd), но удалены все теги заголовков.

введите здесь описание изображения

и SalesOrderRequest_V2_2.xsd ниже

введите здесь описание изображения

Кажется, что квадратный колышек пытается сопоставиться с круглым отверстием. Я попытался отладить это, но не смог выполнить следующий код в файле file0.cs в точке, показанной ниже;

введите здесь описание изображения

Я также не могу найти ничего полезного в Orchestration Debug. Может ли кто-нибудь пролить свет на то, что мне, возможно, не хватает при использовании Xpath?

Полный проект был заархивирован и доступен для загрузки по следующему адресу.

https live.com/redir.aspx?cid=533fd5a521c8c878&resid=533FD5A521C8C878!1848&parid=533FD5A521C8C878!119&authkey=!AE4gYqCoqmZd8xs

Пожалуйста, перейдите по этой ссылке для возможного исправления. Мне удалось получить работоспособное решение, если я изменю файл структуры схемы (XSD).

Вот ссылка: xpath - Как заставить работать метод B?< /а>


person Chrisk    schedule 21.12.2011    source источник
comment
Привет, Филбурт. Реальность такова, что приведенный выше проект и структура хорошо работают с простым определением схемы XSD только с пятью элементами в узле сведений без других элементов заголовка. Если я увеличу сложность схем XSD, как показано на снимках экрана, со многими узлами и элементами в узле заголовка, а также в узле сведений, то я получу ситуацию, когда я получаю ошибку исключения. Насколько я вижу, две схемы с узлом детализации идентичны.   -  person Chrisk    schedule 21.12.2011
comment
В отладке я вижу переменную nRecordCount, заполненную правильным количеством элементов сведений в выражении GetRecordCount. Он входит в MessageLoop, но терпит неудачу в точке, где SingleInput = xpath(Input, sXPath); выражение выполняется. сообщение SingleInput основано на схеме SalesOrderDetail, а sXPath является результатом извлечения из выражения System.String.Format(/*[local-name()='ProcessSalesOrder' and namespace........   -  person Chrisk    schedule 21.12.2011
comment
Я считаю, что есть некоторое несоответствие использования функции xpath, которое я не могу решить с помощью сложных схем в этой версии Orchestration, которая у меня есть. Это должно быть просто, но я, кажется, слеп в этом.   -  person Chrisk    schedule 21.12.2011


Ответы (1)


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

Внутри цикла я создаю простое сообщение счетчика, присваивая текущее значение счетчика.

Далее внутри формы Construct Message у меня есть карта, которая использует сообщение счетчика и исходное исходное сообщение в качестве входных сообщений и схему пакетного сообщения в качестве вывода.

Внутри карты я использую функцию сценария «Вызов шаблона Xslt», которая получает значение счетчика из сообщения счетчика в качестве параметра Xslt. Этот параметр я использую для извлечения нужного исходного узла с тем же XPath (т.е. position()=$param), как и у вас.

Я знаю, что использование шаблона Call Xslt может оказаться для вас неприемлемым просто из-за огромного количества полей.

У меня нет готовой среды разработки BizTalk, но извлечение узла последовательности также должно быть возможным с использованием «простых» функтоидов вместо шаблона Call Xslt.

person Filburt    schedule 21.12.2011