使用XSD

内关联: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;
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值