使用XSD

来源:互联网 发布:什么是软件编程语言 编辑:程序博客网 时间:2024/05/02 04:31

内关联:xml文件XML_1.xml

<?xml version="1.0"?><Class xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="test.xsd"><Teacher Name="张一" Age="31"/> <Student Name="吴七" Age="18"/><Student Name="赵六" Age="17"/><Student Name="王五" Age="19"/><Student Name="钱三" Age="17"/></Class>


xlm文件:XML_2.xml

<?xml version="1.0"?><Class><Teacher Name="张一" Age="31"<Student Name="吴七" Age="18"/><Student Name="赵六" Age="17"/><Student Name="王五" Age="19"/><Student Name="钱三" Age="17"/><Student Name="李四" Age="17"/></Class>
xsd文件:XML_2.xsd

<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">  <xsd:element name="Class">    <xsd:complexType>      <xsd:sequence>        <xsd:element name="Teacher">          <xsd:complexType>            <xsd:sequence/>            <xsd:attribute name="Name" type="xsd:string" use="required"/>            <xsd:attribute name="Age" type="xsd:int" default="25"/>          </xsd:complexType>        </xsd:element>        <xsd:element name="Student" maxOccurs="5">          <xsd:complexType>            <xsd:sequence/>            <xsd:attribute name="Name" type="xsd:string" use="required"/>            <xsd:attribute name="Age" type="xsd:int" default="18"/>          </xsd:complexType>        </xsd:element>      </xsd:sequence>    </xsd:complexType>  </xsd:element></xsd:schema>



使用XML_2.xsd校验XML_2.xml

#include <tchar.h>#include <windows.h>#include <strsafe.h>#include <msxml6.h>#pragma comment (lib,"msxml6.lib")#define GRS_ALLOC(sz)HeapAlloc(GetProcessHeap(),0,sz)#define GRS_CALLOC(sz)HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,sz)#define GRS_SAFEFREE(p)if(NULL != p){HeapFree(GetProcessHeap(),0,p);p=NULL;}#define GRS_USEPRINTF() TCHAR pBuf[1024] = {};DWORD dwRead = 0;#define GRS_PRINTF(...) \StringCchPrintf(pBuf,1024,__VA_ARGS__);\WriteConsole(GetStdHandle(STD_OUTPUT_HANDLE),pBuf,lstrlen(pBuf),NULL,NULL);#define GRS_SAFERELEASE(I) if(NULL != (I)){(I)->Release();(I)=NULL;}#define GRS_COM_CHECK(hr) if(FAILED(hr)){goto CLEAR_UP;}VOID ReportDocErr(LPCTSTR pszXMLFileName,IXMLDOMParseError* pIDocErr ){GRS_USEPRINTF();long lLine=0;long lCol=0;LONG LErrCode=0;BSTR bstrReason=NULL;BSTR bstrSrcText=NULL;pIDocErr->get_line(&lLine);pIDocErr->get_linepos(&lCol);pIDocErr->get_reason(&bstrReason);pIDocErr->get_srcText(&bstrSrcText);GRS_PRINTF(_T("XML文档%s中行%ld,列%ld中的srcTest%s,中lErrorcode:%s,reason%s"),pszXMLFileName,lLine,lCol,bstrSrcText,LErrCode,bstrReason);SysFreeString(bstrReason);SysFreeString(bstrSrcText);}int _tmain(){CoInitialize(NULL);GRS_USEPRINTF();TCHAR pXMLFile1[MAX_PATH]=_T("XML_1.xml");TCHAR pXMLFile2[MAX_PATH]=_T("XML_2.xml");//TCHAR pXSDFile[MAX_PATH]=_T("test.xsd");TCHAR pXSDFile[MAX_PATH]=_T("XML_2.xsd");IXMLDOMDocument2*  pXMLDoc=NULL;IXMLDOMParseError* pXMLErr=NULL;IXMLDOMDocument2* pSchemaDoc=NULL;IXMLDOMSchemaCollection2* pXSDCollection=NULL;VARIANT_BOOL bRet=VARIANT_FALSE;HRESULT hr=S_OK;VARIANT vtXMLFileName={};VARIANT vtXSDFile={};VARIANT vtSchema={};VARIANT vtSchemaDoc={};////1内联schema文件,直接判断加载是否成功////创建XML Dom的com接口,标准的com初始化调用,需要注意:为了能够支持XSD必须创建DOMDocument40对象的IXMLDomDocument2以上的接口//hr=CoCreateInstance(CLSID_DOMDocument60,NULL,//CLSCTX_INPROC_SERVER,IID_IXMLDOMDocument2,(void**)&pXMLDoc);//if (FAILED(hr))//{//GRS_PRINTF(_T("无法创建IXMLDOMDocument接口."));////goto CLEAR_UP;//}////关闭同步特征//hr=pXMLDoc->put_async(VARIANT_FALSE);////打开解析式校验特征//hr=pXMLDoc->put_validateOnParse(VARIANT_TRUE);////加载和判断//vtXMLFileName.vt=VT_BSTR;//vtXMLFileName.bstrVal=SysAllocString(pXMLFile1);//hr=pXMLDoc->load(vtXMLFileName,&bRet);//SysAllocString(vtXMLFileName.bstrVal);//if (VARIANT_TRUE!=bRet||FAILED(hr))//{//pXMLDoc->get_parseError(&pXMLErr);//ReportDocErr(vtXMLFileName.bstrVal,pXMLErr);//goto CLEAR_UP;//}//GRS_PRINTF(_T("%s符合%s框架定义的要求,验证成功\n"),pXMLFile1,pXSDFile);//2 xml内没有关联schema文件,需要程序关联hr=CoCreateInstance(CLSID_XMLSchemaCache40,NULL,CLSCTX_INPROC_SERVER,IID_IXMLDOMSchemaCollection2,(void**)&pXSDCollection);//方法1加载schema文件为DOMDocumenthr=CoCreateInstance(CLSID_DOMDocument40,NULL,CLSCTX_INPROC_SERVER,IID_IXMLDOMDocument2,(void**)&pSchemaDoc);GRS_COM_CHECK(hr);pSchemaDoc->put_async(VARIANT_FALSE);vtXSDFile.vt=VT_BSTR;vtXSDFile.bstrVal=SysAllocString(pXSDFile);hr=pSchemaDoc->load(vtXSDFile,&bRet);SysFreeString(vtXSDFile.bstrVal);if (VARIANT_TRUE!=bRet||FAILED(hr)){pSchemaDoc->get_parseError(&pXMLErr);ReportDocErr(pXSDFile,pXMLErr);goto CLEAR_UP;}vtSchemaDoc.vt=VT_UNKNOWN;vtSchemaDoc.punkVal=pSchemaDoc;hr=pXSDCollection->add(_T(""),vtSchemaDoc);//创建xml文档hr=CoCreateInstance(CLSID_DOMDocument40,NULL,CLSCTX_INPROC_SERVER,IID_IXMLDOMDocument2,(void**)&pXMLDoc);if (FAILED(hr)){GRS_PRINTF(_T("无法创建IXMLDOMDocument2接口"));goto CLEAR_UP;}pXMLDoc->put_async(VARIANT_FALSE);pXMLDoc->put_validateOnParse(VARIANT_TRUE);//关联xml和schemavtSchema.vt=VT_DISPATCH;vtSchema.pdispVal=pXSDCollection;hr=pXMLDoc->putref_schemas(vtSchema);//关联//加载文件和判断vtXMLFileName.vt=VT_BSTR;vtXMLFileName.bstrVal=SysAllocString(pXMLFile2);hr=pXMLDoc->load(vtXMLFileName,&bRet);SysFreeString(vtXMLFileName.bstrVal);if (VARIANT_TRUE!=bRet||FAILED(hr)){pXMLDoc->get_parseError(&pXMLErr);ReportDocErr(pXMLFile2,pXMLErr);goto CLEAR_UP;}GRS_PRINTF(_T("%s,符合%s架构定义要求,验证成功"),pXMLFile2,pXSDFile);CLEAR_UP:GRS_SAFERELEASE(pXMLDoc);GRS_SAFERELEASE(pXMLErr);GRS_SAFERELEASE(pXSDCollection);GRS_SAFERELEASE(pSchemaDoc);CoUninitialize();return 0;}



0 0
原创粉丝点击