锘??xml version="1.0" encoding="utf-8" standalone="yes"?> 鍒╃敤VC++涓?/font>MSXML瑙f瀽XML鏂囨。 涓銆?/span>鏂囨。瀵硅薄妯″瀷錛?font face="Times New Roman">DOM錛?/font> 浜屻?font face="Times New Roman">DOM鐨勫洓涓熀鏈帴鍙?/font>(寮曠敤鑷細http://bbs.xml.org.cn/dispbbs.asp?boardID=11&ID=9220) 鍦?font face="Times New Roman">DOM鎺ュ彛瑙勮寖涓紝鏈夊洓涓熀鏈殑鎺ュ彛錛?font face="Times New Roman">Document錛?/font>Node錛?/font>NodeList浠ュ強NamedNodeMap銆傚湪榪欏洓涓熀鏈帴鍙?nbsp;涓紝Document鎺ュ彛鏄鏂囨。榪涜鎿嶄綔鐨勫叆鍙o紝瀹冩槸浠?/font>Node鎺ュ彛緇ф壙榪囨潵鐨勩?/font>Node鎺ュ彛鏄叾浠栧ぇ澶氭暟鎺ュ彛鐨勭埗綾伙紝璞?nbsp;Documet錛?/font>Element錛?/font>Attribute錛?/font>Text錛?/font>Comment絳夋帴鍙i兘鏄粠Node鎺ュ彛緇ф壙榪囨潵鐨勩?/font>NodeList鎺ュ彛鏄竴涓妭鐐圭殑闆嗗悎錛屽畠鍖呭惈浜嗘煇涓妭鐐逛腑鐨勬墍鏈夊瓙鑺傜偣銆?/font>NamedNodeMap鎺ュ彛涔熸槸涓涓妭鐐圭殑闆嗗悎錛岄氳繃璇ユ帴鍙o紝鍙互寤虹珛鑺傜偣鍚嶅拰鑺傜偣涔嬮棿鐨勪竴涓鏄犲皠鍏崇郴錛屼粠鑰屽埄 鐢ㄨ妭鐐瑰悕鍙互鐩存帴璁塊棶鐗瑰畾鐨勮妭鐐廣備笅闈㈠皢瀵硅繖鍥涗釜鎺ュ彛鍒嗗埆鍋氫竴浜涚畝鍗曠殑浠嬬粛銆?/font> Document鎺ュ彛浠h〃浜嗘暣涓?/font>XML/HTML鏂囨。錛屽洜姝わ紝瀹冩槸鏁存5鏂囨。鏍戠殑鏍癸紝鎻愪緵浜嗗鏂囨。涓殑鏁版嵁榪涜璁塊棶鍜屾搷浣滅殑鍏ュ彛銆?/font> 鍦?font face="Times New Roman">DOM鏍戜腑錛?/font>Document鑺傜偣鏄?/font>DOM鏍戜腑鐨勬牴鑺傜偣錛屼篃鍗沖XML鏂囨。榪涜鎿嶄綔鐨勫叆鍙h妭鐐廣傞氳繃Docuemt鑺傜偣錛屽彲浠ヨ闂埌鏂囨。涓殑鍏朵粬鑺傜偣錛?nbsp;濡傚鐞嗘寚浠ゃ佹敞閲娿佹枃妗g被鍨嬩互鍙?/font>XML鏂囨。鐨勬牴鍏冪礌鑺傜偣絳夌瓑銆傚彟澶栵紝鍦ㄤ竴媯?/font>DOM鏍戜腑錛?/font>Document鑺傜偣鍙互鍖呭惈澶氫釜澶勭悊鎸囦護銆佸涓敞閲婁綔涓哄叾瀛愯妭 鐐癸紝鑰屾枃妗g被鍨嬭妭鐐瑰拰XML鏂囨。鏍瑰厓绱犺妭鐐歸兘鏄敮涓鐨勩?/font> 鍏充簬Document鎺ュ彛鐨?/font>IDL錛?/font>Interface Definition Language鎺ュ彛瀹氫箟璇█錛夊畾涔夊拰鍏朵腑涓浜涙瘮杈冨父鐢ㄧ殑灞炴у拰鏂規硶鐨勮緇嗕粙緇嶅彲浠ュ湪MSDN涓壘鍒般?/font> Node鎺ュ彛鍦ㄦ暣涓?/font>DOM鏍戜腑鍏鋒湁涓捐凍杞婚噸鐨勫湴浣嶏紝DOM鎺ュ彛涓湁寰堝ぇ涓閮ㄥ垎鎺ュ彛鏄粠Node鎺ュ彛緇ф壙榪囨潵鐨勶紝渚嬪錛?/font>Element銆?/font>Attr銆?/font>CDATASection絳夋帴鍙o紝閮芥槸浠?/font>Node緇ф壙榪囨潵鐨勩傚湪DOM鏍戜腑錛?/font>Node鎺ュ彛浠h〃浜嗘爲涓殑涓涓妭鐐廣?/font> NodeList鎺ュ彛鎻愪緵浜嗗鑺傜偣闆嗗悎鐨勬娊璞″畾涔夛紝瀹冨茍涓嶅寘鍚浣曞疄鐜拌繖涓妭鐐歸泦鐨勫畾涔夈?/font>NodeList鐢ㄤ簬琛ㄧず鏈夐『搴忓叧緋葷殑涓緇勮妭鐐癸紝姣斿鏌愪釜鑺傜偣鐨勫瓙鑺傜偣搴忓垪銆傚彟澶栵紝瀹冭繕鍑虹幇鍦ㄤ竴浜涙柟娉曠殑榪斿洖鍊間腑錛屼緥濡?/font>GetNodeByName銆?/font> 鍦?font face="Times New Roman">DOM涓紝NodeList鐨勫璞℃槸"live"鐨勶紝鎹㈠彞璇濊錛屽鏂囨。鐨勬敼鍙橈紝浼氱洿鎺ュ弽鏄犲埌鐩稿叧鐨?/font>NodeList瀵硅薄涓備緥濡傦紝濡傛灉閫氳繃DOM鑾峰緱涓 涓?/font>NodeList瀵硅薄錛岃瀵硅薄涓寘鍚簡鏌愪釜Element鑺傜偣鐨勬墍鏈夊瓙鑺傜偣鐨勯泦鍚堬紝閭d箞錛屽綋鍐嶉氳繃DOM瀵?/font>Element鑺傜偣榪涜鎿嶄綔錛堟坊鍔犮佸垹闄ゃ佹敼 鍔ㄨ妭鐐逛腑鐨勫瓙鑺傜偣錛夋椂錛岃繖浜涙敼鍙樺皢浼氳嚜鍔ㄥ湴鍙嶆槧鍒?/font>NodeList瀵硅薄涓紝鑰屼笉闇DOM搴旂敤紼嬪簭鍐嶅仛鍏朵粬棰濆鐨勬搷浣溿?/font> NodeList涓殑姣忎釜item閮藉彲浠ラ氳繃涓涓儲寮曟潵璁塊棶錛岃绱㈠紩鍊間粠0寮濮嬨?/font> 瀹炵幇浜?font face="Times New Roman">NamedNodeMap鎺ュ彛鐨勫璞′腑鍖呭惈浜嗗彲浠ラ氳繃鍚嶅瓧鏉ヨ闂殑涓緇勮妭鐐圭殑闆嗗悎銆備笉榪囨敞鎰忥紝NamedNodeMap騫朵笉鏄粠NodeList緇?nbsp;鎵胯繃鏉ョ殑錛屽畠鎵鍖呭惈鐨勮妭鐐歸泦涓殑鑺傜偣鏄棤搴忕殑銆傚敖綆¤繖浜涜妭鐐逛篃鍙互閫氳繃绱㈠紩鏉ヨ繘琛岃闂紝浣嗚繖鍙槸鎻愪緵浜嗘灇涓?/font>NamedNodeMap涓墍鍖呭惈鑺傜偣鐨勪竴縐嶇畝 鍗曟柟娉曪紝騫朵笉琛ㄦ槑鍦?/font>DOM瑙勮寖涓負NamedNodeMap涓殑鑺傜偣瑙勫畾浜嗕竴縐嶆帓鍒楅『搴忋?/font> 涓?font face="Times New Roman">NodeList鐩稿悓錛屽湪DOM涓紝NamedNodeMap瀵硅薄涔熸槸"live"鐨勩?/font> 涓夈?font face="Times New Roman">MSXML 鍥涖佺紪紼嬩婦渚?/p>
1銆佺洰鏍囨枃妗o細
{
HRESULT hrRet = S_OK;
// 鏍囧噯QI()鍒濆鍖?nbsp;– 緗?nbsp;*ppv 涓?nbsp;NULL.
*ppv = NULL;
// 濡傛灉瀹㈡埛绔姹傛彁渚涚殑鎺ュ彛錛岀粰 *ppv.璧嬪?nbsp;
if ( IsEqualIID ( riid, IID_IUnknown ))
{
*ppv = (IUnknown*) this;
}
else
{
// 涓嶆彁渚涘鎴風璇鋒眰鐨勬帴鍙?/span>
hrRet = E_NOINTERFACE;
}
// 濡傛灉榪斿洖涓涓帴鍙f寚閽堛?nbsp;璋冪敤AddRef()澧炲姞寮曠敤璁℃暟.
if ( S_OK == hrRet )
{
((IUnknown*) *ppv)->AddRef();
}
return hrRet;
}
鍦≦I()涓仛浜嗕笁浠朵笉鍚岀殑浜嬫儏錛?/span>1銆佸垵濮嬪寲浼犲叆鐨勬寚閽堜負NULL[*ppv = NULL;]銆?/span>2銆佹鏌iid錛岀‘瀹氱粍浠跺璞$被錛坈oclass錛夊疄鐜頒簡瀹㈡埛绔墍璇鋒眰鎺ュ彛.[if ( IsEqualIID ( riid, IID_IUnknown ))]3銆佸鏋滅‘瀹炲疄鐜板嫆绱㈣姹傜殑鎺ュ彛錛屽垯澧炲姞COM瀵硅薄鐨勫紩鐢ㄨ鏁般俒((IUnknown*) *ppv)->AddRef();]AddRef()璋冪敤寰堝叧閿?nbsp; *ppv = (IUnknown*) this;
{
HRESULT CreateInstance( IUnknown* pUnkOuter, REFIID riid, void** ppvObject );
HRESULT LockServer( BOOL fLock );
};
{
// IUnknown 鏂規硶
ULONG AddRef();
ULONG Release();
HRESULT QueryInterface( REFIID riid, void** ppv );
// ISimpleMsgBox鏂規硶
HRESULT DoSimpleMsgBox( HWND hwndParent, BSTR bsMessageText );
};
struct __declspec(uuid("{7D51904D-1645-4a8c-BDE0-0F4A44FC38C4}")) ISimpleMsgBox;
{
public:
CSimpleMsgBoxImpl();
virtual ~CSimpleMsgBoxImpl();
// IUnknown 鏂規硶
ULONG AddRef();
ULONG Release();
HRESULT QueryInterface( REFIID riid, void** ppv );
// ISimpleMsgBox 鏂規硶
HRESULT DoSimpleMsgBox( HWND hwndParent, BSTR bsMessageText );
protected:
ULONG m_uRefCount;
};
class __declspec(uuid("{7D51904E-1645-4a8c-BDE0-0F4A44FC38C4}")) CSimpleMsgBoxImpl;
//褰撴煇涓瀹㈡埛绔兂瑕佸垱寤轟竴涓猄impleMsgBox COM瀵硅薄鏃訛紝瀹冨簲璇ョ敤涓嬮潰榪欐牱鐨勪唬鐮侊細
ISimpleMsgBox* pIMsgBox;
HRESULT hr;// 緇勪歡瀵硅薄綾葷殑CLSID
hr = CoCreateInstance ( __uuidof(CSimpleMsgBoxImpl),
NULL, // 闈炶仛鍚?nbsp;
CLSCTX_INPROC_SERVER, // 榪涚▼鍐呮湇鍔″櫒
__uuidof(ISimpleMsgBox), // 鎵璇鋒眰鎺ュ彛鐨処ID
(void**) &pIMsgBox ); // 榪斿洖鐨勬帴鍙f寚閽堢殑鍦板潃
{
public:
CSimpleMsgBoxClassFactory();
virtual ~CSimpleMsgBoxClassFactory();
// IUnknown鏂規硶
ULONG AddRef();
ULONG Release();
HRESULT QueryInterface( REFIID riid, void** ppv );
// IClassFactory鏂規硶
HRESULT CreateInstance( IUnknown* pUnkOuter, REFIID riid, void** ppv );
HRESULT LockServer( BOOL fLock );protected:
ULONG m_uRefCount;
};
//鏋勯犲嚱鏁般佹瀽鏋勫嚱鏁板拰IUnknown鏂規硶閮藉拰鍓嶉潰渚嬪瓙涓殑涓鏍鳳紝涓嶅悓鐨勫彧鏈塈ClassFactory鐨勬柟娉曪紝LockServer()錛岀湅璧鋒潵鐩稿綋鏇寸畝鍗曪細
HRESULT CSimpleMsgBoxClassFactory::LockServer ( BOOL fLock )
{
fLock ? g_uDllLockCount++ : g_uDllLockCount--;
return S_OK;
}
{ // 媯鏌ュ鎴風鎵瑕佺殑CSimpleMsgBoxImpl綾誨伐鍘?nbsp;
if ( !InlineIsEqualGUID ( rclsid, __uuidof(CSimpleMsgBoxImpl) ))
return CLASS_E_CLASSNOTAVAILABLE;
//媯鏌ユ寚閽坧pv鏄笉鏄痸oid*綾誨瀷
if ( IsBadWritePtr ( ppv, sizeof(void*) ))
return E_POINTER;
*ppv = NULL;
pFactory = new CSimpleMsgBoxClassFactory;
if ( NULL == pFactory )
return E_OUTOFMEMORY;
pFactory->AddRef();
HRESULT hrRet; // 璋冪敤QI()鏌ヨ瀹㈡埛绔墍瑕佺殑綾誨伐鍘傛帴鍙?nbsp;
hrRet = pFactory->QueryInterface ( riid, ppv ); // 浣跨敤瀹岀被宸ュ巶鍚庤皟鐢≧elease()閲婃斁瀹?nbsp;
pFactory->Release();
return hrRet;
}
REFIID riid,
void** ppv )
{ // 鍥犱負涓嶆敮鎸佽仛鍚堬紝鎵浠ヨ繖涓弬鏁皃UnkOuter蹇呴』涓篘ULL.
if ( NULL != pUnkOuter )
return CLASS_E_NOAGGREGATION;
//媯鏌ユ寚閽坧pv鏄笉鏄痸oid*綾誨瀷
if ( IsBadWritePtr ( ppv, sizeof(void*) ))
return E_POINTER;
*ppv = NULL;//媯鏌ュ畬鍙傛暟鐨勬湁鏁堟у悗錛屽氨鍙互鍒涘緩涓涓柊鐨勫璞′簡銆?/span>
CSimpleMsgBoxImpl* pMsgbox; // 鍒涘緩涓涓柊鐨凜OM瀵硅薄
pMsgbox = new CSimpleMsgBoxImpl;
if ( NULL == pMsgbox )
return E_OUTOFMEMORY;//鏈鍚庯紝鐢≦I()鏉ユ煡璇㈠鎴風鎵璇鋒眰鐨勬柊瀵硅薄鐨勬帴鍙c傚鏋淨I()澶辮觸錛屽垯榪欎釜瀵硅薄涓嶅彲鐢紝蹇呴』鍒犻櫎瀹冦?/span>
HRESULT hrRet; // 鐢≦I鏌ヨ瀹㈡埛绔墍璇鋒眰鐨勫璞℃帴鍙?nbsp;
hrRet = pMsgbox->QueryInterface ( riid, ppv ); // 濡傛灉QI澶辮觸錛屽垯鍒犻櫎榪欎釜COM瀵硅薄錛屽洜涓哄鎴風涓嶈兘浣跨敤瀹冿紙瀹㈡埛绔病鏈?nbsp; //榪欎釜瀵硅薄鐨勪換浣曟帴鍙o級
if ( FAILED(hrRet) )
delete pMsgbox;
return hrRet;
}
{
HRESULT hrRet = S_OK; //媯鏌ユ寚閽坧pv鏄笉鏄痸oid*綾誨瀷
if ( IsBadWritePtr ( ppv, sizeof(void*) ))
return E_POINTER; //鏍囧噯鐨凲I鍒濆鍖栵紝灝嗚祴鍊間負NULL.
*ppv = NULL;//鎺ヤ笅鏉ユ鏌iid錛岀湅鐪嬪畠鏄笉鏄被宸ュ巶瀹炵幇鐨勬帴鍙d箣涓錛欼Unknown 鎴?nbsp;IclassFactory銆?nbsp;
// 濡傛灉瀹㈡埛绔姹備竴涓湁鏁堟帴鍙o紝鍒欐壎妞嶇粰 *ppv.
if ( InlineIsEqualGUID ( riid, IID_IUnknown ))
{
*ppv = (IUnknown*) this;
}
else if ( InlineIsEqualGUID ( riid, IID_IClassFactory ))
{
*ppv = (IClassFactory*) this;
}
else
{
hrRet = E_NOINTERFACE;
}//鏈鍚庯紝濡傛灉riid鏄湁鏁堟帴鍙o紝鍒欒皟鐢ㄦ帴鍙g殑AddRef()錛岀劧鍚庤繑鍥炪?nbsp;
//濡傛灉榪斿洖鏈夋晥鎺ュ彛鎸囬拡錛屽垯璋冪敤AddRef()
if ( S_OK == hrRet )
{
((IUnknown*) *ppv)->AddRef();
}
return hrRet;
}
{
_bstr_t bsMsg = bsMessageText;
LPCTSTR szMsg = (TCHAR*) bsMsg;
// 濡傛灉闇瑕佺殑璇濓紝鐢╛bstr_t灝嗕覆杞崲涓篈NSI 鍋氬畬杞崲鐨勫伐浣滃悗錛屾樉紺轟俊鎭錛岀劧鍚庤繑鍥炪?nbsp;
MessageBox ( hwndParent, szMsg, _T("Simple Message Box"), MB_OK );
return S_OK;
}
{
ISimpleMsgBox* pIMsgBox;
HRESULT hr;
hr = CoCreateInstance ( __uuidof(CSimpleMsgBoxImpl), // 緇勪歡瀵硅薄綾葷殑CLSID
NULL, // 闈炶仛鍚?nbsp;
CLSCTX_INPROC_SERVER, // 鍙嬌鐢ㄨ繘紼嬪唴鏈嶅姟鍣?nbsp;
__uuidof(ISimpleMsgBox), // 鎵璇鋒眰鎺ュ彛鐨処ID
(void**) &pIMsgBox ); // 瀹圭撼鎺ュ彛鎸囬拡鐨勭紦鍐?nbsp;
if ( FAILED(hr) )
return;
//鐒跺悗璋冪敤DoSimpleMsgBox()鏂規硶騫墮噴鏀炬帴鍙c?nbsp;
pIMsgBox->DoSimpleMsgBox ( hMainWnd, _bstr_t("Hello COM!") );
pIMsgBox->Release();
}
{
// IUnknown 鏂規硶
STDMETHOD_(ULONG, AddRef)() PURE;
STDMETHOD_(ULONG, Release)() PURE;
STDMETHOD(QueryInterface)(REFIID riid, void** ppv) PURE;
// ISimpleMsgBox 鏂規硶
STDMETHOD(DoSimpleMsgBox)(HWND hwndParent, BSTR bsMessageText) PURE;
};
]]>
銆銆DOM鏄?/font>Document Object Model錛堟枃妗e璞℃ā鍨嬶級鐨勭畝縐幫紝鏄XML鏂囨。榪涜搴旂敤寮鍙戙佺紪紼嬬殑搴旂敤紼嬪簭鎺ュ彛錛?/font>API錛夈備綔涓?/font>W3C鍏竷鐨勪竴縐嶈法騫沖彴銆佷笌璇█鏃犲叧鐨勬帴鍙h鑼冿紝DOM鎻愪緵浜嗗湪涓嶅悓鐜鍜屽簲鐢ㄤ腑鐨勬爣鍑嗙▼搴忔帴鍙o紝鍙互鐢ㄤ換浣曡璦瀹炵幇銆?/font>
銆銆DOM閲囩敤瀵硅薄妯″瀷鍜屼竴緋誨垪鐨勬帴鍙f潵鎻忚堪XML鏂囨。鐨勫唴瀹瑰拰緇撴瀯錛屽嵆鍒╃敤瀵硅薄鎶婃枃妗fā鍨嬪寲銆傝繖縐嶅璞℃ā鍨嬪疄鐜扮殑鍩烘湰鍔熻兘鍖呮嫭錛?/font>
銆銆鈼?nbsp;鎻忚堪鏂囨。琛ㄧず鍜屾搷浣滅殑鎺ュ彛錛?/font>
銆銆鈼?nbsp;鎺ュ彛鐨勫睘鎬у拰鏂規硶錛?/font>
銆銆鈼?nbsp;鎺ュ彛涔嬮棿鐨勫叧緋諱互鍙婁簰鎿嶄綔銆?/font>
銆銆DOM鍙緇撴瀯鍖栫殑XML鏂囨。榪涜瑙f瀽錛屾枃妗d腑鐨勬寚浠ゃ佸厓绱犮佸疄浣撱佸睘鎬х瓑鎵鏈夊唴瀹逛釜浣撻兘鐢ㄥ璞℃ā鍨嬭〃紺猴紝鏁翠釜鏂囨。琚湅鎴愭槸涓涓湁緇撴瀯鐨?/font>淇℃伅鏍?/span>錛岃屼笉鏄畝鍗曠殑鏂囨湰嫻侊紝鐢熸垚鐨勫璞℃ā鍨嬪氨鏄爲鐨勮妭鐐癸紝瀵硅薄鍚屾椂鍖呭惈浜?/span>鏂規硶鍜?/span>灞炴?/span>銆傚洜姝わ紝瀵規枃妗g殑鎵鏈夋搷浣滈兘鏄湪瀵硅薄鏍?/span>涓婄殑榪涜銆傚湪DOM涓紝鏍戜腑鐨勪竴鍒囬兘鏄璞★紝涓嶇鏄牴鑺傜偣榪樻槸瀹炰綋鐨勫睘鎬с?/font>
銆銆鍦?font face="Times New Roman">DOM涓富瑕佹湁浠ヤ笅涓変釜瀵硅薄錛?/font>
銆銆鈼?/font> XML鏂囨。瀵硅薄
XML鏂囨。鏃㈡槸涓縐嶅璞★紝鍚屾椂鍙堜唬琛ㄦ暣涓?/font>XML鏂囨。銆傚畠鐢?/font>鏍瑰厓绱?/span>鍜?/span>瀛愬厓绱?/span>緇勬垚銆?/span>
銆銆鈼?/font> XML鑺傜偣瀵硅薄
XML鑺傜偣瀵硅薄浠h〃鐨勬槸XML鏂囨。鍐呴儴鐨勮妭鐐癸紝濡傚厓绱犮佹敞閲娿佸悕瀛楃┖闂寸瓑銆?/font>
銆銆鈼?nbsp;XML鑺傜偣鍒楄〃
XML鏂囨。妯″潡鍒楄〃浠h〃浜嗚妭鐐圭殑闆嗗悎銆?/font>
銆銆鍒╃敤DOM錛屽紑鍙戜漢鍛樺彲浠ュ姩鎬佸湴鍒涘緩XML鏂囨。錛?/font>閬嶅巻緇撴瀯錛?/span>娣誨姞銆佷慨鏀廣佸垹闄?/span>鍐呭絳夈傚叾闈㈠悜瀵硅薄鐨勭壒鎬э紝浣夸漢浠湪澶勭悊XML瑙f瀽鐩稿叧鐨勪簨鍔℃椂鑺傜渷澶ч噺鐨勭簿鍔涳紝鏄竴縐嶇鍚堜唬鐮侀噸鐢ㄦ濇兂鐨勫己鏈夊姏緙栫▼宸ュ叿銆?/font>
1銆?/font>Document鎺ュ彛
鐢變簬鍏冪礌銆佹枃鏈妭鐐廣佹敞閲娿佸鐞嗘寚浠ょ瓑閮戒笉鑳借劚紱繪枃妗g殑涓婁笅鏂囧叧緋昏岀嫭绔嬪瓨鍦紝鎵浠ュ湪Document鎺ュ彛鎻愪緵浜嗗垱寤哄叾浠栬妭鐐瑰璞$殑鏂規硶錛岄氳繃璇ユ柟娉曞垱寤虹殑鑺傜偣瀵硅薄閮芥湁涓涓?/font>ownerDocument灞炴э紝鐢ㄦ潵琛ㄦ槑褰撳墠鑺傜偣鏄敱璋佹墍鍒涘緩鐨勪互鍙婅妭鐐瑰悓Document涔嬮棿鐨勮仈緋匯?/font>
2銆?/font>Node鎺ュ彛
3銆?/font>NodeList鎺ュ彛
4銆?/font>NamedNodeMap鎺ュ彛
NamedNodeMap琛ㄧず鐨勬槸涓緇勮妭鐐瑰拰鍏跺敮涓鍚嶅瓧鐨勪竴涓瀵瑰簲鍏崇郴錛岃繖涓帴鍙d富瑕佺敤鍦ㄥ睘鎬ц妭鐐圭殑琛ㄧず涓娿?/font>
浠庣悊璁轟笂璇達紝鏍規嵁XML鐨勬牸寮忓畾涔夛紝鎴戜滑鍙互鑷繁緙栧啓涓涓?/font>XML鐨勮娉曞垎鏋愬櫒錛屼絾瀹為檯涓婂井杞凡緇忕粰鎴戜滑鎻愪緵浜嗕竴涓?/font>XML璇硶瑙f瀽鍣紝鍗充竴涓彨鍋?nbsp;MSXML.DLL鐨勫姩鎬侀摼鎺ュ簱錛屽疄闄呬笂瀹冩槸涓涓?/font>COM錛?/font>Component Object Model錛夊璞″簱錛岄噷闈㈠皝瑁呬簡榪涜XML瑙f瀽鏃舵墍闇瑕佺殑鎵鏈夊璞°傚洜涓?/font>COM鏄竴縐嶄互浜岃繘鍒舵牸寮忓嚭鐜扮殑鍜岃璦鏃犲叧鐨勫彲閲嶇敤瀵硅薄錛屾墍浠ヤ綘鍙互鐢ㄤ換浣曡璦 (姣斿VB錛?/font>VC錛?/font>DELPHI錛?/font>C++ Builder鐢氳嚦鏄剼鏈璦絳夌瓑)瀵瑰畠榪涜璋冪敤錛屽湪浣犵殑搴旂敤涓疄鐜板XML鏂囨。鐨勮В鏋愩?/font>
銆銆MSXML.DLL鎵鍖呮嫭鐨勪富瑕?/font>COM鎺ュ彛鏈夛細
銆銆1. IXMLDOMDocument(Document鎺ュ彛)
DOMDocument瀵硅薄鏄?/font>XML DOM鐨勫熀紜錛屼綘鍙互鍒╃敤瀹冩墍鏆撮湶鐨勫睘鎬у拰鏂規硶鏉ユ祻瑙堛佹煡璇㈠拰淇敼XML鏂囨。鐨勫唴瀹瑰拰緇撴瀯銆?/font>DOMDocument琛ㄧず浜嗘爲鐨勯《灞傝妭鐐癸紝瀹冨疄鐜頒簡DOM鏂?nbsp;妗g殑鎵鏈夌殑鍩烘湰鏂規硶錛屽茍涓旀彁渚涗簡棰濆鐨勬垚鍛樺嚱鏁版潵鏀寔XSL鍜?/font>XSLT銆傚畠鍒涘緩浜嗕竴涓枃妗e璞★紝鎵鏈夊叾浠栫殑瀵硅薄閮藉彲浠ヤ粠榪欎釜鏂囨。瀵硅薄涓緱鍒板拰鍒涘緩銆?/font>
銆銆2. IXMLDOMNode(Node鎺ュ彛)
銆銆IXMLDOMNode鏄枃妗e璞℃ā鍨?/font>(DOM)涓殑鍩烘湰瀵硅薄錛屽厓绱犮佸睘鎬с佹敞閲娿佽繃紼嬫寚浠ゅ拰鍏朵粬鐨勬枃妗g粍浠墮兘鍙互璁や負鏄?/font>IXMLDOMNode銆備簨瀹炰笂錛?/font>DOMDocument瀵硅薄鏈韓涔熸槸涓涓?/font>IXMLDOMNode瀵硅薄銆?/font>
銆銆3. IXMLDOMNodeList
銆銆IXMLDOMNodeList瀹為檯涓婃槸涓涓妭鐐?/font>(Node)瀵硅薄鐨勯泦鍚堬紝鑺傜偣鐨勫鍔犮佸垹闄ゅ拰鍙樺寲閮藉彲浠ュ湪闆嗗悎涓珛鍒誨弽鏄犲嚭鏉ワ紝鍙互閫氳繃"for.寰幆 "緇撴瀯鏉ラ亶鍘嗘墍鏈夌殑鑺傜偣銆?/font>
銆銆4. IXMLDOMParseError
銆銆IXMLDOMParseError鎺ュ彛鐢ㄦ潵榪斿洖鍦ㄨВ鏋愯繃紼嬩腑鎵鍑虹幇鐨勮緇嗙殑淇℃伅錛屽寘鎷敊璇彿銆佽鍙楓佸瓧絎︿綅緗拰鏂囨湰鎻忚堪銆?/font>
銆銆鍦ㄥ叿浣撳簲鐢ㄦ椂鍙互鐢?font face="Times New Roman">DOMDocument鐨?/font>Load鏂規硶鏉ヨ杞?/font>XML鏂囨。錛岀敤IXMLDOMNode 鐨?/font>selectNodes錛堟煡璇㈢殑緇撴灉鏈夊涓紝寰楀埌瀛樻斁鎼滅儲緇撴灉鐨勯摼琛級鎴?/font>selectSingleNode錛堟煡璇㈢殑緇撴灉鏈変竴涓紝鍦ㄦ湁澶氫釜鐨勬儏鍐典笅榪斿洖鎵?nbsp;鍒扮殑絎竴涓妭鐐癸級鏂規硶榪涜鏌ヨ錛岀敤createNode鍜?/font>appendChild鏂規硶鏉ュ垱寤鴻妭鐐瑰拰榪藉姞鑺傜偣錛岀敤IXMLDOMElement鐨?nbsp;setAttribute鍜?/font>getAttribute鏂規硶鏉ヨ緗拰鑾峰緱鑺傜偣鐨勫睘鎬с?/font>
<book id="bk101">
<author>lizlex</author>
<title>XML Developer's Guide</title>
</book>
2銆佹楠わ細
(1)鍦⊿tdAfx.h涓紩鍏ュ姩鎬侀摼鎺ュ簱 MSXML.DLL(C:\windows\system32\msxml4.dll)
#import <msxml4.dll>
(2)鐣岄潰璁捐錛?br>鍒嗗埆鏀懼叆涓変釜Text錛岀敤浜庤緭鍏ユ暟鎹紝涓庢樉紺烘枃妗e唴瀹圭敤錛屽茍娣誨姞鍏寵仈鐨勬垚鍛樺彉閲弇_strId,m_strAuthor, m_strTitle錛涘茍娣誨姞紜畾鎸夐挳錛?br>
(3)浜х敓鏂囨。鐨勭▼搴忕墖鏂?br>void CXmlparseDlg::OnButtonGenerate()
{
UpdateData();
MSXML2::IXMLDOMDocumentPtr pDoc;
MSXML2::IXMLDOMElementPtr xmlRoot ;
//鍒涘緩DOMDocument瀵硅薄
HRESULT hr = pDoc.CreateInstance(__uuidof(MSXML2::DOMDocument40));
if(!SUCCEEDED(hr))
{
MessageBox("鏃犳硶鍒涘緩DOMDocument瀵硅薄錛岃媯鏌ユ槸鍚﹀畨瑁呬簡MS XML Parser 榪愯搴?");
return ;
}
//鏍硅妭鐐圭殑鍚嶇О涓築ook
//鍒涘緩鍏冪礌騫舵坊鍔犲埌鏂囨。涓?/span>
xmlRoot=pDoc->createElement((_bstr_t)"Book");
//璁劇疆灞炴?/span>
xmlRoot->setAttribute("id",(const char *)m_strId);
pDoc->appendChild(xmlRoot);
MSXML2::IXMLDOMElementPtr pNode;
//娣誨姞“author”鍏冪礌
pNode=pDoc->createElement((_bstr_t)"Author");
pNode->Puttext((_bstr_t)(const char *)m_strAuthor);
xmlRoot->appendChild(pNode);
//娣誨姞“Title”鍏冪礌
pNode=pDoc->createElement("Title");
pNode->Puttext((const char *)m_strTitle);
xmlRoot->appendChild(pNode);
//淇濆瓨鍒版枃浠?br> //濡傛灉涓嶅瓨鍦ㄥ氨寤虹珛,瀛樺湪灝辮鐩?/span>
pDoc->save("d:\\he.xml");
}
(4)璇誨彇XML鏂囨。鐨勭▼搴忕墖鏂?br>void CXmlparseDlg::OnButtonLoad()
{
MSXML2::IXMLDOMDocumentPtr pDoc;
HRESULT hr;
hr=pDoc.CreateInstance(__uuidof(MSXML2::DOMDocument40));
if(FAILED(hr))
{
MessageBox("鏃犳硶鍒涘緩DOMDocument瀵硅薄錛岃媯鏌ユ槸鍚﹀畨瑁呬簡MS XML Parser 榪愯搴?");
return ;
}
//鍔犺澆鏂囦歡
pDoc->load("d:\\he.xml");
MSXML2::IXMLDOMNodePtr pNode;
//鍦ㄦ爲涓煡鎵懼悕涓築ook鐨勮妭鐐?"//"琛ㄧず鍦ㄤ換鎰忎竴灞傛煡鎵?/span>
pNode=pDoc->selectSingleNode("//Book");
MSXML2::DOMNodeType nodeType;
//寰楀埌鑺傜偣綾誨瀷
pNode->get_nodeType(&nodeType);
//鑺傜偣鍚嶇О
CString strName;
strName=(char *)pNode->GetnodeName();
//鑺傜偣灞炴?鏀懼湪閾捐〃涓?/span>
MSXML2::IXMLDOMNamedNodeMapPtr pAttrMap=NULL;
MSXML2::IXMLDOMNodePtr pAttrItem;
_variant_t variantValue;
pNode->get_attributes(&pAttrMap);
long count;
count=pAttrMap->get_length(&count);
pAttrMap->get_item(0,&pAttrItem);
//鍙栧緱鑺傜偣鐨勫?/span>
pAttrItem->get_nodeTypedValue(&variantValue);
m_strId=(char *)(_bstr_t)variantValue;
UpdateData(FALSE);
}
]]>