您的位置:首页 > 其它

使用XSD

2014-09-11 16:23 87 查看
内关联: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文件为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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: