#include <stdio.h> #import <msxml5.dll> using namespace MSXML2; int main(int argc, char* argv[]) { HRESULT hr; CoInitialize(NULL); IXMLDOMDocument3Ptr pXMLDoc; 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; } IXMLDOMDocument3Ptr pXSDDoc; 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; } IXMLDOMSchemaCollectionPtr pSCache; 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; } printf("Validating DOM...\n"); // Validate the entire DOM object. IXMLDOMParseError2Ptr pError =pXMLDoc->validate(); if (pError->errorCode != 0) { printf("invalid dom:\n\treason:\n%s", (LPCSTR)pError->reason); printf("\terrorXPath:\n%s", (LPCSTR)pError->errorXPath); printf("\nParameters Count: %d\n", pError->errorParametersCount); for (int i=0; i<pError->errorParametersCount; i++) { printf("\terrorParameters(%d): %s\n", i, (LPCSTR)pError->errorParameters(i)); } } else printf("\tDOM is valid:\n%s\n", (LPCSTR)pXMLDoc->xml); printf("\n\nValidating nodes...\n"); IXMLDOMNodeListPtr pNodeList; pNodeList = pXMLDoc->selectNodes("//book"); for (int i=0; i<pNodeList->length; i++) { pError = pXMLDoc->validateNode(pNodeList->item[i]); if (pError->errorCode != 0) { printf("\nNode is invalid:\n\treason: %s", (LPCSTR)pError->reason); printf("\terrorXPath:\n%s", (LPCSTR)pError->errorXPath); printf("\nParameters Count: %d\n", pError->errorParametersCount); for (int j=0; j<pError->errorParametersCount; j++) { printf("\terrorParameters(%d): %s\n", j, (LPCSTR)pError->errorParameters(j)); } } else { IXMLDOMNodePtr pNode=pNodeList->item[i]; printf("\nNode is valid:\n%s\n", (LPCSTR)pNode->xml); } } pError.Release(); pXMLDoc.Release(); pNodeList.Release(); pSCache.Release(); pXSDDoc.Release(); CoUninitialize(); return 0; }
Try It!
Note You can also copy these files into the project's main directory using Windows Explorer (or a command prompt).