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