ホーム > デベロッパ > SophiaFramework > BREW C++ 逆引きコード集

BREW C++ プログラミング : SophiaFramework 逆引き FAQ・コード集

DOM パーサーを使って SOAP 文書を解析する

SFXSOAPParser::Parse を使って、XML 文書を読み込み、解析します。

SFXSOAPParser クラスは SFXXMLDOMParser クラスを継承します。

// 解析対象の XML 文書( "soapmessage.xml" )
<?xml version="1.0" encoding="UTF-8"?>
<env:Envelope xmlns:env="http://www.w3.org/2003/05/soap-envelope" >
 <env:Header>
    <SubscriptionInfo xmlns="http://schemas.xmlsoap.org">
      <LicenseStatusCode>0</LicenseStatusCode>
      <LicenseStatus>Valid license key</LicenseStatus>
      <LicenseActionCode>0</LicenseActionCode>
      <LicenseAction>Decremented hit count</LicenseAction>
      <RemainingHits>18</RemainingHits>
      <Amount>0</Amount>
    </SubscriptionInfo>
 </env:Header>
 <env:Body>
  <m:GetLastTradePriceResponse 
        env:encodingStyle="http://www.w3.org/2003/05/soap-envelope"
        xmlns:m="http://example.org/2001/06/quotes">
   <Price>34.5</Price>
  </m:GetLastTradePriceResponse>
  <m:GetLastTradePriceResponse
        env:encodingStyle="http://www.w3.org/2003/05/soap-envelope"
        xmlns:m="http://example.org/2006/06/quotes">
   <Price>56.5</Price>
  </m:GetLastTradePriceResponse>
 </env:Body>
</env:Envelope>

SOAP 文書の解析のサンプルコードです。

SFXSOAPParser soapparser; // SOAP パーサー

// SOAP 文書を読み込み、解析する
// soapmessage.xml に保存した SOAP 文書を解析する
if  (soapparser.Parse("soapmessage.xml") != SFERR_NO_ERROR) {

    // エラーコードを表示する
    TRACE("error id = 0x%x", soapparser.static_catch());

    // エラーメッセージを表示する
    TRACE(soapparser.GetErrorInfo());

// 解析が完了したら行う処理を記述する
} else {

    // SOAP 文書のバージョンを取得し表示する
    // SOAP メッセージのバージョンは SFXSOAPParser::SOAP_VERSION_1_2 になる
     // soap version : 1
    TRACE("soap version : %d", soapparser.GetSoapVersion()); 

    // Envelope 要素を取得する
    SFXXMLElementPtr envelope = soapparser.GetEnvelope();

    // Envelope 要素の名前空間を取得する
    // envelope version : http://www.w3.org/2003/05/soap-envelope
    TRACE("envelope version : %s", envelope->GetNamespaceURI());  

    // Header 要素を取得する
    SFXXMLElementPtr header = soapparser.GetHeader();
    // Header 要素の名前空間を取得する
    // header version : http://www.w3.org/2003/05/soap-envelope
    TRACE("header version : %s", header->GetNamespaceURI());  

    / SOAP メッセージの Header の中のすべてのエントリーノードを取得する
    SFXXMLNode::DOMNodeListPtr list = soapparser.GetHeaderEntries();

    // 要素数の取得し表示する
    // entry number : 1
    TRACE("entry number : %d", list->GetSize());  

    // エントリーノードを取得する
    SFXXMLElementPtr entry = soapparser.GetHeaderEntry("SubscriptionInfo", "http://schemas.xmlsoap.org");

    // エントリーノードのすべての子を取得する
    list = entry->GetChildNodes();

    // 列挙子を取得する
    SFXXMLNode::DOMNodeList::Enumerator childiter = list->GetFirstEnumerator();

    while (childiter.HasNext()) {

        SFXXMLElementPtr current = static_cast<SFXXMLElementPtr>(childiter.GetNext());

        // 各要素の名前を取得し表示する
        // current element name : "LicenseStatusCode" "LicenseStatus" "LicenseActionCode" "RemainingHits" "Amount"
        TRACE("current element name : %s", current->GetName());  
        
        // 各要素の文字列を取得し表示する
        // current element content : "0" "Valid license key" "0" "Decremented hit count" "18" "0"
        TRACE("current element content : %s", current->GetText().GetCString()); 
    }

    // SOAP メッセージの Body 要素を取得する
    SFXXMLElementPtr body = soapparser.GetBody();

    // Body 要素の名前空間を取得する
    // body version : http://www.w3.org/2003/05/soap-envelope
    TRACE("body version : %s", body->GetNamespaceURI());   

    // SOAP メッセージの Body の中に持つすべてのエントリーノードを取得する
    list = soapparser.GetBodyEntries();

    // 要素数の取得し表示する
    TRACE("entry number: %d", list->GetSize());  // 2

   // 列挙子を取得する
    childiter = list->GetFirstEnumerator();

    while (childiter.HasNext()) {

        SFXXMLElementPtr current = static_cast<SFXXMLElementPtr>(childiter.GetNext());

        // 各要素内容を取得し表示する
        // current element name : "GetLastTradePriceResponse" "GetLastTradePriceResponse"
        TRACE("current element name : %s", current->GetLocalName()); 
        // 各要素の名前空間を取得し表示する
        // current element namespace : "http://example.org/2001/06/quotes" "http://example.org/2006/06/quotes"
        TRACE("current element namespace : %s", current->GetNamespaceURI()); 

        // 価格を取得し表示する
        // price : "34.5" "56.5"
        TRACE("price : %s", current->GetText().GetCString());  
    }
}