#include <stdio.h>
#import <msxml5.dll>
using namespace MSXML2;
int main(int argc, char* argv[])
{
HRESULT hr;
CoInitialize(NULL);
IXMLDOMDocument3Ptr pXMLDoc;
IXMLDOMDocument3Ptr pXSDDoc;
IXMLDOMSchemaCollectionPtr pSCache;
IXMLDOMParseError2Ptr pEitem;
IXMLDOMParseError2Ptr pError;
hr = pXMLDoc.CreateInstance(__uuidof(DOMDocument50));
if (FAILED(hr))
{
printf("Failed to CreateInstance on an XML DOM");
return -1;
}
pXMLDoc->async = VARIANT_FALSE;
pXMLDoc->validateOnParse = VARIANT_FALSE;
hr = pXMLDoc->setProperty("MultipleErrorMessages", VARIANT_TRUE);
if (FAILED(hr))
{
printf("Failed to enable mulitple validation errors\n");
return -1;
}
if(pXMLDoc->load("books.xml")!=VARIANT_TRUE)
{
printf("Failed to load DOM from books.xml. %s\n",
(LPCSTR)pXMLDoc->parseError->reason);
return -1;
}
hr = pXSDDoc.CreateInstance(__uuidof(DOMDocument50));
if (FAILED(hr))
{
printf("Failed to CreateInstance on an XSD Doc");
return -1;
}
pXSDDoc->async = VARIANT_FALSE;
pXSDDoc->validateOnParse = VARIANT_FALSE;
if(pXSDDoc->load("books.xsd")!=VARIANT_TRUE)
{
printf("Failed to load XSD from books.xsd. %s\n",
(LPCSTR)pXSDDoc->parseError->reason);
return -1;
}
hr = pSCache.CreateInstance(__uuidof(XMLSchemaCache50));
if (FAILED(hr)) {
printf("Cannot instantiate XMLSchemaCache50\n");
return -1;
}
pXMLDoc->schemas = pSCache.GetInterfacePtr();
hr = pSCache->add("urn:books", pXSDDoc.GetInterfacePtr());
if (FAILED(hr)) {
printf("Cannot add 'urn:books' to schema cache.\n");
return -1;
}
// Validate the entire DOM object.
pError =pXMLDoc->validate();
if (pError->errorCode != 0) {
printf("Error as returned from validate():\n\n");
printf("\tError Code: %d\n", pError->errorCode);
printf("\tError reason: \n%s", (LPCSTR)pError->reason);
printf("\tError location: \n%s\n",
(LPCSTR)pError->errorXPath);
printf("\tErrors count: %d\n",pError->allErrors->length);
printf("\nError items from the allErrors collection:\n");
for (int i=0; i<pError->allErrors->length; i++)
{
pEitem = pError->allErrors->item[i];
printf("\nErrorItem[%d]:\n",i);
printf("\treason:\n%s",(LPCSTR)pEitem->reason);
printf("\tlocation: \n%s\n",(LPCSTR)pEitem->errorXPath);
}
}
else
printf("valid dom as follows:\n%s\n",
(LPCSTR)pXMLDoc->xml);
pError.Release();
pEitem.Release();
pXMLDoc.Release();
pXSDDoc.Release();
pSCache.Release();
CoUninitialize();
return 0;
}
Try It!
Note You can also copy the file into the project's main directory using Windows Explorer (or a command prompt).