使用XSD
2014-09-11 16:23
87 查看
内关联:xml文件XML_1.xml
xlm文件:XML_2.xml
使用XML_2.xsd校验XML_2.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文件为DOMDocument hr=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和schema vtSchema.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; }
相关文章推荐
- 使用 xsd.exe 命令工具 将 xsd架构 生成 类文件
- 使用xsd生成代码
- 一个简单的系统配置文件使用DTD和XSD两种方式描述
- 使用 xsd 工具从 RDL 架构生成类
- [代码]使用XSD验证XML示例2(LINQ to XML)
- jaxb jaxp使用xml来生成动态页面 - xml xsd xsl ( xpath xslt ) css 概念入门
- java中使用xsd验证xml
- ASP.NET数据集(xsd)使用示例
- 使用xsd.exe命令 根据指定的xml文件生成对应的xsd架构文件
- .NET2005中使用XSD文件创建自定义DataSet
- DNN中使用XSD dataset之tableadapter出错
- 使用架构(XSD)验证XML文件
- 将XSD架构文件嵌入资源使用
- DNN中使用XSD dataset之tableadapter出错
- ASP.NET中XML、XSD、XSL三者可以同时结合使用
- 使用 IBM Rational Software Architect 在 Java 中处理 XSD
- 使用 xsd.exe 命令工具 将 xsd架构 生成 类文件
- XSD使用
- [代码]使用XSD验证XML示例1(LINQ to XML)
- 使用 xsd.exe 命令工具 将 xsd架构 生成 类文件