2011-10-26 8 views
0

を処理することができないので、SOAP応答がmultirefが含まれている私は「>は、WCFサービスを消費生成されたアイテムを追加」ウィザードでのBizTalkでWCFサービスを消費サービスが解析できない応答を返しています。 理由:受信ドキュメントの解析中にエラーが発生しました:「1行目、296行目の複数のルート要素があります。サービスが期待される操作を行うことから、私は思う問題がmultiRefタグのBizTalk -</p> <p>私が持っている問題がある - それは

に関係している私は自動生成されたスキーマ

を使用しているので、驚きだが、エラーメッセージではありません

応答:

<ns1:sendSmsSubmissionResponse soapenv:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" xmlns:ns1="http://mobicomp.com/smsexpress/webservice/server/message"> 
    <sendSmsSubmissionReturn href="#id0" /> 
</ns1:sendSmsSubmissionResponse> 
<multiRef id="id0" soapenc:root="0" soapenv:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" xsi:type="ns2:SubmissionStatus" xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/" xmlns:ns2="http://mobicomp.com/smsexpress/webservice/server/message"> 
    <id xsi:type="soapenc:string">4336723</id> 
    <message xsi:type="soapenc:string">Submissão enviada para processamento.</message> 
    <status href="#id1" /> 
</multiRef> 
<multiRef id="id1" soapenc:root="0" soapenv:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" xsi:type="xsd:int" xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/">0</multiRef> 

スキーマ

<xs:schema xmlns:tns="http://mobicomp.com/smsexpress/webservice/server/message" xmlns:b="http://schemas.microsoft.com/BizTalk/2003" targetNamespace="http://mobicomp.com/smsexpress/webservice/server/message" id="sendSmsSubmissionResponse" xmlns:xs="http://www.w3.org/2001/XMLSchema"> 
    <xs:include schemaLocation=".\SubmissionManagerService_mobicomp_com_smsexpress_webservice_server_message.xsd" /> 
    <xs:annotation> 
     <xs:appinfo> 
      <schemaInfo root_reference="sendSmsSubmissionResponse" xmlns="http://schemas.microsoft.com/BizTalk/2003" /> 
      <b:references> 
       <b:reference targetNamespace="http://common.server.webservice.smsexpress.mobicomp.com" /> 
       <b:reference targetNamespace="http://mobicomp.com/smsexpress/webservice/server/message" /> 
       <b:reference targetNamespace="http://schemas.xmlsoap.org/soap/encoding/" /> 
      </b:references> 
     </xs:appinfo> 
    </xs:annotation> 
    <xs:element name="sendSmsSubmissionResponse"> 
     <xs:annotation> 
      <xs:documentation>Wrapper element for message "sendSmsSubmissionResponse" of RPC operation "sendSmsSubmission".</xs:documentation> 
     </xs:annotation> 
     <xs:complexType> 
      <xs:sequence> 
       <xs:element name="sendSmsSubmissionReturn" type="tns:SubmissionStatus" /> 
      </xs:sequence> 
     </xs:complexType> 
    </xs:element> 
</xs:schema> 

このエラーが発生しないようにするにはどうすればよいですか?

ありがとうございました!

EDIT:

は「sendSmsSubmissionResponseは、」あなたは唯一のBizTalkメッセージ処理における単一のルート要素を持つことができ、問題に

答えて

2

私はを作成し、私はちょうどそれが誰かが同じ問題に走るケース

それを書き留めするつもりだそれを

を解くOK]をクリックして、カスタムパイプラインを受け取ります最初にXMLを標準のXSLで変換します Dissasembleで石鹸を取り除き、封筒を外して本体を残すだけです

次に、biztalkはXMLメッセージを受け取り、私は処理します編通常

私はhereが見つかりましたが微調整された1使用XSL:XSLTを使用して

<xsl:stylesheet version="1.0" 
      xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
      xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/" > 

<xsl:key name="multiref-by-id" match="multiRef" use="@id"/> 

<xsl:template match="/"> 
    <xsl:copy> 
     <xsl:apply-templates select="@*|*"/> 
    </xsl:copy> 
</xsl:template> 

<xsl:template match="*[starts-with(@href, '#')]"> 
    <xsl:copy> 
     <xsl:apply-templates select="@* | 
     key('multiref-by-id', substring-after(@href, '#'))/@*[not(local-name()='id' or local-name()='type')] | 
     key('multiref-by-id', substring-after(@href, '#'))/node()"/> 
    </xsl:copy> 
</xsl:template> 

<xsl:template match="@href[starts-with(., '#')] | multiRef[@id] | @soapenc:root"/> 

<xsl:template match="@*|node()"> 
    <xsl:copy> 
     <xsl:apply-templates select="@*|node()"/> 
    </xsl:copy> 
</xsl:template> 

+1

あなたは私の人生を救った。現代のJava wsフレームワークで、厄介なAxis 1 rpc/encoded形式のメッセージを消費するのは素晴らしいことです。 –

+0

何を微調整しましたか? –

+0

ダンは申し訳ありませんが、それは2年前のことであり、覚えていません。私が知っていることは、私がXSLの専門家ではないので、予期される結果を得るまで「試行錯誤」でした。 – Juan

0

を解決していないことを、スキーマ内のルートの参照を指定します。これを行うには複数の方法がありますが、基本的にメッセージ内の各繰り返しルートをデバッチして、別々に処理できるようにするか、または処理できるようにラッパー要素を作成する必要があります。このタイプのコンポーネントは、パイプラインステージ(カスタムパイプライン)に存在する必要があります。

また、メッセージをXMLとして扱い、サイズやインデックスが必要かどうかに応じて解析することもできます。 、

デコード:

+1

カスタムパイプラインは、それを再フォーマットしますか? http://stackoverflow.com/questions/5185389/creating-xslt-transform-to-flatten-multiref-encoded-soap-message私は試してみる – Juan

関連する問題