2010-12-12 12 views
1

私はASP-NET Webサービスから次のXMLを取得します(それだけで3日間かかりました)。しかし、私はそのようなXMLのnubeだから、私はどのように基本的な表示テーブルにそれをフォーマットするのか分からない。私はそれが私が理解し、私のサイトはCFのサイトであるので、それは寒冷にある必要があります。それは私も何も知らないdiffgramを使用します。しかし、私は学ぶ準備ができています!あなたが<cfinvoke>を使用すると、物事が近いからネイティブフォーマットで戻ってくるのColdFusionからのSOAP Webサービスを消費するときASP - > Coldfusion Webservice XML

<?xml version="1.0" encoding="UTF-8"?> 
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 
    <soap:Body> 
     <BillingResponse xmlns="http://portal/customer.asmx">  
      <BillingResult> 
       <xs:schema id="NewDataSet" xmlns="" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata" xmlns:xs="http://www.w3.org/2001/XMLSchema"> 
        <xs:element msdata:IsDataSet="true" msdata:UseCurrentLocale="true" name="NewDataSet"> 
         <xs:complexType> 
          <xs:choice maxOccurs="unbounded" minOccurs="0"> 
           <xs:element name="Table"> 
            <xs:complexType> 
             <xs:sequence> 
              <xs:element minOccurs="0" name="CustomerCode" type="xs:int"/> 
              <xs:element minOccurs="0" name="ServiceCode" type="xs:int"/> 
              <xs:element minOccurs="0" name="SubscriberCode" type="xs:string"/> 
              <xs:element minOccurs="0" name="Status" type="xs:string"/> 
             </xs:sequence> 
            </xs:complexType> 
           </xs:element> 
          </xs:choice> 
         </xs:complexType> 
        </xs:element> 
       </xs:schema> 

       <diffgr:diffgram xmlns:diffgr="urn:schemas-microsoft-com:xml-diffgram-v1" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata"> 

        <NewDataSet xmlns=""> 
         <Table diffgr:id="Table1" msdata:rowOrder="0"> 
          <CustomerCode>1114309</CustomerCode> 
          <ServiceCode>0</ServiceCode> 
          <SubscriberCode/> 
          <Status/> 
         </Table> 
         <Table diffgr:id="Table2" msdata:rowOrder="1"> 
          <CustomerCode>1114309</CustomerCode> 
          <ServiceCode>2</ServiceCode> 
          <SubscriberCode>95205292</SubscriberCode> 
          <Status>OPEN</Status> 
         </Table> 
         <Table diffgr:id="Table3" msdata:rowOrder="2"> 
          <CustomerCode>1114309</CustomerCode> 
          <ServiceCode>8</ServiceCode> 
          <SubscriberCode>dageorgetti</SubscriberCode> 
          <Status>1</Status> 
         </Table> 
         <Table diffgr:id="Table4" msdata:rowOrder="3"> 
          <CustomerCode>1114309</CustomerCode> 
          <ServiceCode>16</ServiceCode> 
          <SubscriberCode>NTL00711</SubscriberCode> 
          <Status>CLOSED</Status> 
         </Table> 
         <Table diffgr:id="Table5" msdata:rowOrder="4"> 
          <CustomerCode>1114309</CustomerCode> 
          <ServiceCode>16</ServiceCode> 
          <SubscriberCode>95205292</SubscriberCode> 
          <Status>CLOSED</Status> 
         </Table> 
         <Table diffgr:id="Table6" msdata:rowOrder="5"> 
          <CustomerCode>1114309</CustomerCode> 
          <ServiceCode>16</ServiceCode> 
          <SubscriberCode>95205292</SubscriberCode> 
          <Status>OPEN</Status> 
         </Table> 
         <Table diffgr:id="Table7" msdata:rowOrder="6"> 
          <CustomerCode>1114309</CustomerCode> 
          <ServiceCode>4096</ServiceCode> 
          <SubscriberCode>64280452637</SubscriberCode> 
          <Status>OPEN</Status> 
         </Table> 
         <Table diffgr:id="Table8" msdata:rowOrder="7"> 
          <CustomerCode>1114309</CustomerCode> 
          <ServiceCode>4096</ServiceCode> 
          <SubscriberCode>64280426643</SubscriberCode> 
          <Status>OPEN</Status> 
         </Table> 
        </NewDataSet> 
       </diffgr:diffgram> 
      </BillingResult> 
     </BillingResponse> 
    </soap:Body> 
</soap:Envelope> 

任意のコードスニペットや、このホラーショーを通じて助けを大幅に通常

答えて

3

をいただければ幸いです。

しかし、特にASP.NET ASMX Webサービスを使用している場合、返されたXMLとColdFusionのパーサーが常にうまくいくとは限りません。私は手動で処理する傾向があります。

このコードはAPIコールを作成するためのメソッドです。まず、手動でHTTPリクエストを行います。その後

<cftry> 
    <cfhttp 
     url="#wsLocation#" 
     result="local.wsResult" 
     method="post" 
     timeout="#variables.timeout#" 
     throwonerror="true" 
    > 
     <cfhttpparam type="formfield" name="inputName" value="inputValue" /> 
     <cfhttpparam type="formfield" name="inputName" value="inputValue" /> 
     <cfhttpparam type="formfield" name="inputName" value="inputValue" /> 
    </cfhttp> 

一般的なエラー条件のチェック:(あなたには、いくつかの-の/すべての/なし-の/以上、よりこれらに遭遇する場合があります)

<cfif trim(local.wsResult.fileContent) eq "Connection Timeout"> 
     <cfthrow message="Request timeout while connecting to .Net API" detail="#local.wsResult.statusCode#" /> 
    </cfif> 
    <cfif not isXML(local.wsResult.FileContent)> 
     <cfthrow message="ASP.NET WS did not return valid XML." detail="#local.wsResult.FileContent#" /> 
    </cfif> 

その後、返されたXMLを解析し、あなたが興味のある部分だけを返す:

<cfset local.wsResponse = xmlParse(local.wsResult.Filecontent) /> 
    <cfset local.rspContainer = local.wsResponse['soap:envelope']['soap:body'].BillingResponse.BillingResult /> 

    <cfcatch> 
     <cfset local.arguments = arguments /> 
     <cfset errorEmail(cfcatch, local) /> 
     <cfreturn "" /> 
    </cfcatch> 
</cftry> 
<cfreturn local.rspContainer /> 

これは、その内部の<BillingResponse>ノードとすべてを返します。

次に、必要なデータを解析する必要があります。 XPath式とXMLSearch関数を使用するか、データが単純な場合は手動で取得するだけです。

参照しているDiffGram xmlは、.NETコードでDataTableオブジェクトを返すためです。

dataContainer = apiRequest(whatever); //calls the method above 

まず取得するために子要素があることを確認してください:

local.emptySet = QueryNew("GivenName,Surname,FileAs,CompanyName"); 
if (not structKeyExists(local.dataContainer, "DocumentElement")){ return local.emptySet; } 
//emptySet is whatever object you're converting the xml into, only with no data, so 
//maybe an empty query or structure or something. 

そして、子要素の配列を取得:私の場合は

local.items = local.dataContainer.DocumentElement.XmlChildren; 

をここで私は、ColdFusionでいることをどのように処理するかです私はクエリを作成しているので、すべてのデータを保持するのに十分な行をクエリに追加します。

//create enough rows in the query to store the contact data 
QueryAddRow(local.emptySet, arrayLen(local.items)); 

次に、子要素の配列内の各ノードをループし、その値をクエリにコピーします。変数local.fieldListは、DataTableの各行内にあるxmlノードのリストであり、リストを使用して各フィールドを取得します。外側ループはDataTableの行を反復処理し、内側ループは行の列を反復処理します。コードを比較的小さくするために私のリストから多くを切り捨てましたが、リストを大きくすることには問題ありません。

//popuplate the query 
for (local.i = 1; local.i lte arrayLen(local.items); local.i = local.i + 1){ 
    local.fieldList = "GivenName,Surname,FileAs,CompanyName"; 
    for (local.j = 1; local.j lte listLen(local.fieldList); local.j = local.j + 1){ 
     local.key = listGetAt(local.fieldList, local.j); 
     if (structKeyExists(local.items[local.i], local.key)){ 
      QuerySetCell(local.emptySet, local.key, local.items[local.i][local.key].XmlText, local.i); 
     } 
    } 
} 
return local.emptySet; 

ああ、これはまた、あなたのDataTable内のフィールド名が正確にそれは彼らがにコピーするのクエリの列名と同じであることを前提としています。

+0

ありがとうございました!が正しいですか?これの真下のcfcatchブロックがトリガされていますか?しかし、私は上記の行をコメントアウトしていない場合。私は間違っています。 – user460114

+0

ええと、私はこれを行うべきだと思います: ''上記の答えのコードブロックも更新しました。 –

+0

ええ、URLに?WSDLを追加していれば、その変更でエラーは消えます。そうでなければ、私はまだエラーが発生します。私はこの部分について混乱しています:dataContainer = apiRequest(何でも);ここでどのような変数を置き換えますか? – user460114

関連する問題