BizTalk 2010:同じ名前の多くの要素を使用してXSDをマッピングする
-
02-10-2019 - |
質問
Bitzalk 2010では、次の構造で入力からXMLにマッピングする必要があります。
<REQUEST>
<PROGRAM name="PROGRAM123">
<INPUT>
<INSTRUCT name="INSTR1">
<FIELD name="FIELD11">VALUE1</FIELD>
<FIELD name="FIELD12">VALUE2</FIELD>
<FIELD name="FIELD13">VALUE3</FIELD>
</INSTRUCT>
<INSTRUCT name="INSTR2">
<FIELD name="FIELD21">VALUE4</FIELD>
<FIELD name="FIELD22">VALUE5</FIELD>
<FIELD name="FIELD23">VALUE6</FIELD>
<FIELD name="FIELD24">VALUE7</FIELD>
</INSTRUCT>
<INSTRUCT name="INSTR2">
<FIELD name="FIELD21">VALUE8</FIELD>
<FIELD name="FIELD22">VALUE9</FIELD>
<FIELD name="FIELD23">VALUE10</FIELD>
<FIELD name="FIELD24">VALUE11</FIELD>
</INSTRUCT>
</INPUT>
</PROGRAM>
</REQUEST>
生成されたXSDは次のようでした:
<?xml version="1.0" encoding="utf-8"?>
<xs:schema id="REQUEST" xmlns="" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xs:element name="REQUEST" msdata:IsDataSet="true" msdata:Locale="en-US">
<xs:complexType>
<xs:choice minOccurs="0" maxOccurs="unbounded">
<xs:element name="PROGRAM">
<xs:complexType>
<xs:sequence>
<xs:element name="INPUT" minOccurs="0" maxOccurs="unbounded">
<xs:complexType>
<xs:sequence>
<xs:element name="INSTRUCT" minOccurs="0" maxOccurs="unbounded">
<xs:complexType>
<xs:sequence>
<xs:element name="FIELD" nillable="true" minOccurs="0" maxOccurs="unbounded">
<xs:complexType>
<xs:simpleContent msdata:ColumnName="FIELD_Text" msdata:Ordinal="1">
<xs:extension base="xs:string">
<xs:attribute name="name" type="xs:string" />
</xs:extension>
</xs:simpleContent>
</xs:complexType>
</xs:element>
</xs:sequence>
<xs:attribute name="name" type="xs:string" />
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:sequence>
<xs:attribute name="name" type="xs:string" />
</xs:complexType>
</xs:element>
</xs:choice>
</xs:complexType>
</xs:element>
</xs:schema>
生成された構造は単なる「一般」であり、テーブルループ係数を使用してビズトークにマッピングする必要があります。私はこのソリューションから情報を持っています: http://hestia.typepad.com/flatlander/2007/01/mapping_fixed_e.htmlしかし、これは私にとって非常に面倒なように思えます(私は、いくつかの一定の値を持つ40のフィールドを持っています)。
別の可能性は、XSLTを使用することです。しかし、私はそれの経験がありません、そして私はそれをBizTalk(XSLTなし)に直接マッピングすることを好みます
XSDスキームを作成する可能性はあるので、マップエディターにすべてのフィールドを作成し、そこにマッピングを作成します(テーブルループ係数を使用せずに)。
アイデア /コメントが高く評価されます(答えが「XSLTを使用する」という答えであっても)
解決
とにかく、通常、私たちはXSLTを使用してXSLTを使用しています。
とにかくBizTalkはあなたのためにXSLTを作成します:)
だからお勧めします:
- BizTalk Mapperでできる限り最善を尽くします(リクエスト、プログラム、入力、および指示がマッピング可能です)
- プロジェクトを編集します
- クリックしてください
.btm
Visual Studioのソリューションエクスプローラーにファイルし、上部の「すべてのファイルを表示」を選択します。これで、隠されたファイルが表示されるはずですSameFileName.btm.cs
. 。このファイルには、BizTalkが生成するXSLTがあります。このXSLTをコピーして、新しいファイルに貼り付けます - これを.xsltとして保存します。二重引用符を単一の引用に置き換える必要があります。 - 元の.btm(MAP)を再度開きます。スキーマ(グリッドプロパティ)の間のマップグレーの領域をクリックします。 「カスタムXSLT PATH」プロパティで、新しく作成した.XSLTファイルを選択します。
BizTalk's Mapperは、XSLTのヘッドスタートを提供してくれました。基本的なXSLTを非常に簡単に手に入れることができるはずです。 1つのゴッチャ - 名前空間エイリアスプレフィックス(通常はS1)を覚えていることを確認してください
編集:上記はBizTalk 2009のものであることに注意してください
編集
正気の予防措置として、BTMの視覚マップでは、カスタムXSLTを使用していることを忘れた場合に備えて、グレーマッピングエリアからすべてのマッピングラインと係数を手動で削除することをお勧めします。カスタムXSLTでマップをテストすると、MapperはXSLTファイルが使用され、視覚マップが無視されていることをリマインダーします。
他のヒント
生成されたXLSTを取得するためのより簡単な方法(および少なくともBTS2006以来機能している推奨方法)は、ソリューションエクスプローラーのBTMファイルを右クリックして「検証マップ」を選択することです。この出力により、スタンドアロンファイルのXSLTオブジェクトと拡張オブジェクトの両方が得られます(特定の係数と外部クラス参照は、拡張オブジェクトファイルを使用します)。
ここからXSLT出力を節約して変更できます - .btm.csファイルを解析したり、属性や名前空間の周りに逃げ出した二重引用を逃すなどの文字列エンコードの問題について心配する必要はありません...