Chilkat HOME Android™ ASP Visual Basic VB.NET C# iOS (IPhone) Objective-C C++ C Unicode C++ Unicode C MFC Delphi DLL Delphi ActiveX FoxPro Java Perl PHP Extension PHP ActiveX Python PowerShell Ruby SQL Server VBScript
Parse SOAP XMLDemonstrates how to parse SOAP XML. Downloads: MS Windows Visual C/C++ Libraries Linux/CentOS C/C++ Libraries MAC OS X C/C++ Libraries Solaris C/C++ Libraries C++ Builder Libraries FreeBSD C++ Libraries HP-UX C++ Libraries BlackBerry QNX C++ Libraries // Needs #include <CkXml.h> CkString strOut; bool success; CkXml xml; // The Chilkat XML component is freeware. // Load an XML document. // This document may be downloaded at: // http://www.chilkatsoft.com/testData/soap1.xml success = xml.LoadXmlFile("soap1.xml"); if (success == false) { strOut.append(xml.lastErrorText()); strOut.append("\r\n"); SetDlgItemText(IDC_EDIT1,strOut.getUnicode()); return; } // The sample XML document parsed here is a prime example // of how NOT to design your XML schema. When designing // XML, always keep in mind how a program might parse it. // Poorly designed XML is a big pain-in-the-ass to parse. // We'll show you a much better schema at the end of this // example. // Here's the XML we'll want to parse: // <?xml version="1.0" encoding="utf-8"?><soap:Envelope // xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" // xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" // xmlns:xsd="http://www.w3.org/2001/XMLSchema"> // <soap:Body> // <SendRequestResponse // xmlns="http://merchantwarehouse.com/webservices/public/MerchantWareService1"> // <SendRequestResult> // <Code>Approved</Code> // <ProcessorData>[Response_Code][00][Response_Text][106857][Auth_Reference // ][0016][Amount_Balance][205.78][Expiration_Date][012014][Trans_Date_Time // ][012209000734][Card_Number][710001900593731][Transaction_ID][1]</ProcessorData> // <Fields><Field> // <Code>Unknown</Code><Value>1</Value> // </Field> // <Field> // <Code>Message</Code><Value>106857</Value> // </Field> // <Field> // <Code>AuthCodeResp</Code><Value>0016</Value> // </Field> // <Field> // <Code>Balance</Code><Value>205.78</Value> // </Field> // </Fields> // </SendRequestResult> // </SendRequestResponse> // </soap:Body> // </soap:Envelope> // The poor design choice in the above XML is to use the same tag over and over. // For example "Field", "Code", and "Value". // Here's a much much better design, and you'll see later how the parsing is so much simpler: // // ... // <Fields> // <Message>106857</Message> // <AuthCodeResp>0016</AuthCodeResp> // <Balance>205.78</Balance> // </Fields> // ... // Notice it's much more compact. // The other poor design choice is globbing all of that information in "ProcessorData". // You can't use XML alone to parse the contents of that node -- you'll have to write // some custom string parsing code for it... (ughhh) // // OK... so let's parse this beast... // We already have it loaded in an instance of the XML object. // Drill down to the SendRequestResult node: xml.FirstChild2(); xml.FirstChild2(); xml.FirstChild2(); // Find the "Fields" node: CkXml *xmlFields = 0; xmlFields = xml.GetChildWithTag("Fields"); // Iterate over each field: long i; CkXml *xmlField = 0; long numChildren; numChildren = xmlFields->get_NumChildren(); for (i = 0; i <= numChildren - 1; i++) { xmlField = xmlFields->GetChild(i); if (xmlField->HasChildWithTagAndContent("Code","Message") == true) { strOut.append("Message: "); strOut.append(xmlField->GetChildContent("Value")); strOut.append("\r\n"); } // Use the same logic for the other fields you want to capture... delete xmlField; } delete xmlFields; // Here's the XML parsing code if the XML were designed like this: // ... // <Fields> // <Unknown>1</Unknown> // <Message>106857</Message> // <AuthCodeResp>0016</AuthCodeResp> // <Balance>205.78</Balance> // </Fields> // ... success = xml.LoadXmlFile("soap2.xml"); if (success == false) { strOut.append(xml.lastErrorText()); strOut.append("\r\n"); SetDlgItemText(IDC_EDIT1,strOut.getUnicode()); return; } xml.FirstChild2(); xml.FirstChild2(); xml.FirstChild2(); // Find the "Fields" node: xmlFields = xml.GetChildWithTag("Fields"); // Get each value: strOut.append("-----"); strOut.append("\r\n"); strOut.append("Message: "); strOut.append(xmlFields->GetChildContent("Message")); strOut.append("\r\n"); strOut.append("AuthCodeResp:"); strOut.append(xmlFields->GetChildContent("AuthCodeResp")); strOut.append("\r\n"); strOut.append("Balance: "); strOut.append(xmlFields->GetChildContent("Balance")); strOut.append("\r\n"); delete xmlFields; SetDlgItemText(IDC_EDIT1,strOut.getUnicode()); |
© 2000-2013 Chilkat Software, Inc. All Rights Reserved.