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;
}
Top of Page
© 1997 Microsoft Corporation. All rights reserved. Terms of Use.