#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).