Chilkat
HOME
Android™
ASP
Visual Basic
VB.NET
C#
iOS (IPhone)
Objective-C
C++
C
MFC
Delphi
FoxPro
Java
Perl
PHP Extension
PHP ActiveX
Python
PowerShell
Ruby
SQL Server
VBScript
|
Parse SOAP XMLDemonstrates how to parse SOAP XML. LOCAL lnSuccess LOCAL loXml LOCAL loXmlFields LOCAL i LOCAL loXmlField LOCAL lnNumChildren loXml = CreateObject('Chilkat.Xml') * The Chilkat XML component is freeware. * Load an XML document. * This document may be downloaded at: * http://www.chilkatsoft.com/testData/soap1.xml lnSuccess = loXml.LoadXmlFile("soap1.xml") IF (lnSuccess = 0) THEN =MESSAGEBOX(loXml.LastErrorText) QUIT ENDIF * 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: loXml.FirstChild2() loXml.FirstChild2() loXml.FirstChild2() * Find the "Fields" node: loXmlFields = loXml.GetChildWithTag("Fields") * Iterate over each field: lnNumChildren = loXmlFields.NumChildren FOR i = 0 TO lnNumChildren - 1 loXmlField = loXmlFields.GetChild(i) IF (loXmlField.HasChildWithTagAndContent("Code","Message") = 1) THEN ? "Message: " + loXmlField.GetChildContent("Value") ENDIF * Use the same logic for the other fields you want to capture... RELEASE loXmlField NEXT RELEASE loXmlFields * 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> * ... lnSuccess = loXml.LoadXmlFile("soap2.xml") IF (lnSuccess = 0) THEN =MESSAGEBOX(loXml.LastErrorText) QUIT ENDIF loXml.FirstChild2() loXml.FirstChild2() loXml.FirstChild2() * Find the "Fields" node: loXmlFields = loXml.GetChildWithTag("Fields") * Get each value: ? "-----" ? "Message: " + loXmlFields.GetChildContent("Message") ? "AuthCodeResp:" + loXmlFields.GetChildContent("AuthCodeResp") ? "Balance: " + loXmlFields.GetChildContent("Balance") RELEASE loXmlFields |
© 2000-2010 Chilkat Software, Inc. All Rights Reserved.
Mail Component · .NET Email Component · ASP Mail Component · XML Parser