Отображение коллекции в виде строки на целевой узел

Я использую biztalk 2009 и мне нужна помощь с отображением. У меня есть вход как:

<root>
    <shop>
        <product>
            <type>1</type>
            <code>ab</code>
            <desc></desc>
        </product>
        <product>
            <type>2</type>
            <code>cd</code>
            <desc></desc>
        </product>
    </shop>
    <address />
    <names />
</root>

Я хочу отобразить коллекцию продуктов на целевой элемент в виде строки xml, которая выглядит следующим образом:<products><product type="1" code="ab" /><product type="2" code="cd" /></products>

Я нашел решение с использованием пользовательского xslt, но я не хочу его использовать, поскольку мы обнаружили, что оно очень непостоянно. Есть ли какие-нибудь функтоиды, которые могли бы сделать это для меня с помощью некоторых пользовательских сценариев? Я также Ac острые Dev Спасибо!

2 ответа

Это полностью выполнимо из коробки с простой картой.

Вот файл XML soure:

<root>
    <shop>
        <product>
            <type>1</type>
            <code>ab</code>
            <desc></desc>
        </product>
        <product>
            <type>2</type>
            <code>cd</code>
            <desc></desc>
        </product>
    </shop>
    <address />
    <names />
</root>

Вот схема источника:

<?xml version="1.0" encoding="utf-16"?>
<xs:schema xmlns:b="http://schemas.microsoft.com/BizTalk/2003" xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <xs:element name="root">
    <xs:complexType>
      <xs:sequence>
        <xs:element name="shop">
          <xs:complexType>
            <xs:sequence>
              <xs:element minOccurs="1" maxOccurs="unbounded" name="product">
                <xs:complexType>
                  <xs:sequence>
                    <xs:element name="type" type="xs:string" />
                    <xs:element name="code" type="xs:string" />
                    <xs:element name="desc" type="xs:string" />
                  </xs:sequence>
                </xs:complexType>
              </xs:element>
            </xs:sequence>
          </xs:complexType>
        </xs:element>
        <xs:element name="address">
          <xs:complexType />
        </xs:element>
        <xs:element name="names">
          <xs:complexType />
        </xs:element>
      </xs:sequence>
    </xs:complexType>
  </xs:element>
</xs:schema>

Вот целевая схема:

<?xml version="1.0" encoding="utf-16"?>
<xs:schema xmlns:b="http://schemas.microsoft.com/BizTalk/2003" xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <xs:element name="products">
    <xs:complexType>
      <xs:sequence>
        <xs:element minOccurs="1" maxOccurs="unbounded" name="product">
          <xs:complexType mixed="true">
            <xs:attribute name="type" type="xs:string" />
            <xs:attribute name="code" type="xs:string" />
          </xs:complexType>
        </xs:element>
      </xs:sequence>
    </xs:complexType>
  </xs:element>
</xs:schema>

А вот и карта:

Карта BizTalk для схем источника и назначения

И вот вывод:

<products>
    <product type="1" code="ab" /> 
    <product type="2" code="cd" /> 
</products>

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

Как скопировать весь узел в элемент строкового типа на карте

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

Вспомогательный метод может принимать сообщение biztalk в качестве аргумента типа XLANGMessage и возвращать тип XMLDocument, который будет преобразован в целевой тип сообщения, при условии, что XML внутри отображает тип правильно.

Например:

public static XmlDocument HelperMethod (XLANGMessage message)
{
    var sourceType = (SourceType)message[0].RetrieveAs(typeof(SourceType));
    var targetType = new TargetType();

    // ... Do target type population and serialization to XmlDocument here

    return targetAsXmlDoc;
}

Было бы тривиально сделать это внутри.net, так что просто возьмите это в.net и сделайте это. Извините всех картографических гуру там!

Другие вопросы по тегам