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()); } }









