如何用schema驗證xml(MSXML),簡單VC程式碼
void CSchemaXmlDlg ::OnBnClickedButton1 ()
{
CString strScmFile = g_strRootPath + _T ("//schema.xsd" );
try
{
//1.xml 內關聯了 schema 檔案,直接判斷載入是否成功
{
CString strXmlFile = g_strRootPath + _T ("//xml_1.xml" );
_variant_t vFile ((LPCTSTR )strXmlFile );
// 建立元件
MSXML2
::IXMLDOMDocumentPtr
pDoc .CreateInstance (MSXML2 ::CLSID_DOMDocument40 );
pDoc ->async = VARIANT_FALSE ;
pDoc ->validateOnParse = VARIANT_TRUE ;
// 載入和判斷
VARIANT_BOOL bRet = pDoc ->load (vFile );
if (bRet == VARIANT_TRUE )
{
MessageBox (_T ("xml_1.xml 載入成功 " ));
}
else
{
CString strError ;
MSXML2 ::IXMLDOMParseErrorPtr pError = pDoc ->parseError ;
strError .Format (
_T ("xml_1.xml 載入失敗: code=%d, reson=%s" ),
pError ->errorCode , (LPCTSTR )pError ->reason );
MessageBox (strError );
}
}
//2.xml 內沒有關聯 schema
{
CString strXmlFile = g_strRootPath + _T ("//xml_2.xml" );
_variant_t vFile ((LPCTSTR )strXmlFile );
// 建立 schema
MSXML2 ::IXMLDOMSchemaCollectionPtr pSchema ;
pSchema .CreateInstance (MSXML2 ::CLSID_XMLSchemaCache40 );
// 載入 schema 檔案,或者以檔名為引數
//MSXML2::IXMLDOMDocumentPtr pSchemaDoc;
//pSchemaDoc.CreateInstance(MSXML2::CLSID_DOMDocument40);
//pSchemaDoc->async = VARIANT_FALSE;;
//pSchemaDoc->load(_variant_t((LPCTSTR)strScmFile));
//pSchema->add(_bstr_t(L""), pSchemaDoc.GetInterfacePtr());
pSchema ->add (_bstr_t (L "" ), _variant_t ((LPCTSTR )strScmFile ));
// 建立檔案元件
MSXML2 ::IXMLDOMDocumentPtr pDoc ;
pDoc .CreateInstance (MSXML2 ::CLSID_DOMDocument40 );
pDoc ->async = VARIANT_FALSE ;
pDoc ->validateOnParse = VARIANT_TRUE ;
// 關聯 xml 和 schema
MSXML2 ::IXMLDOMDocument2Ptr pDoc2 = pDoc ;
//pDoc2->putref_schemas(_variant_t(pSchema));// 這句不行
pDoc2 ->schemas = pSchema .GetInterfacePtr ();
// 載入檔案和判斷
VARIANT_BOOL bRet = pDoc ->load (vFile );
if (bRet == VARIANT_TRUE )
{
MessageBox (_T ("xml_2.xml 載入成功 " ));
}
else
{
CString strError ;
MSXML2 ::IXMLDOMParseErrorPtr pError = pDoc ->parseError ;
strError .Format (
_T ("xml_2.xml 載入失敗: code=%d, reson=%s" ),
pError ->errorCode , (LPCTSTR )pError ->reason );
MessageBox (strError );
}
}
}
catch (...)
{
MessageBox (_T (" 程式出現異常! " ));
}
}