Sample 1: Parsing an XML File
#define UNICODE #include <windows.h> #include <windowsx.h> #include <stdlib.h> #include <stdio.h> #include <io.h> #include <urlmon.h> #include <hlink.h> #include <dispex.h> #include "mshtml.h" #include "msxml.h" #define ASSERT(x) if(!(x)) DebugBreak() #define CHECK_ERROR(cond, err) if (!(cond)) {pszErr=(err); goto done;} #define SAFERELEASE(p) if (p) {(p)->Release(); p = NULL;} else ; int _cdecl main (int argc, char **argv) { PSTR pszErr = NULL; IXMLDocument *pDoc = NULL; IStream *pStm = NULL; IPersistStreamInit *pPSI = NULL; CHAR buf[MAX_PATH]; CHAR *pszURL; HRESULT hr; // // Check usage. // if (argc != 2) { fprintf (stderr, "Usage: %s URL\n", argv[0]); fprintf (stderr, "Eg %s c:\\nt\\private\\inet\\xml\\test\\channel.cdf\n", argv[0]); fprintf (stderr, "or %s http://ohserv/users/julianj/msnbc.cdf\n", argv[0]); exit (1); } // // HACK if passed in a file name; expand if it doesn't look like a URL. // if (CompareStringA(LOCALE_USER_DEFAULT, NORM_IGNORECASE, argv[1], 7, "http://", 7) == CSTR_EQUAL) { pszURL = argv[1]; } else { pszURL = buf; GetFullPathNameA(argv[1], MAX_PATH, pszURL, NULL); } hr = CoInitialize(NULL); ASSERT(SUCCEEDED(hr)); // // Create an empty XML document. // hr = CoCreateInstance(CLSID_XMLDocument, NULL, CLSCTX_INPROC_SERVER, IID_IXMLDocument, (void**)&pDoc); CHECK_ERROR (pDoc, "CoCreateInstance Failed"); // // Synchronously create a stream on a URL. // hr = URLOpenBlockingStreamA(0, pszURL, &pStm, 0,0); CHECK_ERROR(SUCCEEDED(hr) && pStm, "Couldn't open stream on URL") // // Get the IPersistStreamInit interface to the XML doc. // hr = pDoc->QueryInterface(IID_IPersistStreamInit, (void **)&pPSI); CHECK_ERROR(SUCCEEDED(hr), "QI for IPersistStreamInit failed"); // // Init the XML doc from the stream. // hr = pPSI->Load(pStm); //CHECK_ERROR(SUCCEEDED(hr), "Couldn't load XML doc from stream"); if(SUCCEEDED(hr)) { printf("%s : XML File is well formed \r\n",argv[0]); } else { // Print error information ! IXMLError *pXMLError = NULL ; XML_ERROR xmle; hr = pPSI->QueryInterface(IID_IXMLError, (void **)&pXMLError); CHECK_ERROR(SUCCEEDED(hr), "Couldn't get IXMLError"); ASSERT(pXMLError); hr = pXMLError->GetErrorInfo(&xmle); SAFERELEASE(pXMLError); CHECK_ERROR(SUCCEEDED(hr), "GetErrorInfo Failed"); printf("%s :", argv[0]); wprintf(TEXT(" Error on line %d. Found %s while expecting %s\r\n"), xmle._nLine, xmle._pszFound, xmle._pszExpected); SysFreeString(xmle._pszFound); SysFreeString(xmle._pszExpected); SysFreeString(xmle._pchBuf); } done: // Clean up. // // Release any used interfaces. // SAFERELEASE(pPSI); SAFERELEASE(pStm); SAFERELEASE(pDoc); if (pszErr) fprintf (stderr, "%s, last error %d\n", pszErr, GetLastError()); return 0; }
© 1999 Microsoft Corporation. All rights reserved. Terms of use.