1. 程式人生 > >如何用schema驗證xml(MSXML),簡單VC程式碼

如何用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 ;

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 (" 程式出現異常! " ));

}

}