一個(gè)輕量級(jí)Parsing 實(shí)現(xiàn)。這個(gè)代碼不會(huì)從網(wǎng)上下載任何資料,也不會(huì)執(zhí)行任何腳本,純屬Parsing。 Parsing是通過MSHTML的Markup Service實(shí)現(xiàn)的。要正確使用這個(gè)代碼,需要添加MSHTML引用。 由于.net中沒有定義IPersistStreamInt接口,就必須自己實(shí)現(xiàn),接口定義:
以下內(nèi)容為程序代碼:
[ComVisible(true), ComImport(), Guid("7FD52380-4E07-101B-AE2D-08002B2EC713 " ) , InterfaceTypeAttribute(ComInterfaceType.InterfaceIsIUnknown)] public interface IPersistStreamInit { void GetClassID([In, Out] ref Guid pClassID); [return: MarshalAs(UnmanagedType.I4)] [PreserveSig] int IsDirty(); void Load([In, MarshalAs(UnmanagedType.Interface)] UCOMIStream pstm); void Save([In, MarshalAs(UnmanagedType.Interface)] UCOMIStream pstm, [In, MarshalAs(UnmanagedType.I4)] int fClearDirty); void GetSizeMax([Out, MarshalAs(UnmanagedType.LPArray)] long pcbSize); void InitNew(); }
| |
以下內(nèi)容為程序代碼:
unsafe IHTMLDocument2 Parse(string s) { IHTMLDocument2 pDocument=new HTMLDocumentClass(); if(pDocument!=null) { IPersistStreamInit pPersist=pDocument as IPersistStreamInit ; pPersist.InitNew(); pPersist=null; IMarkupServices ms=pDocument as IMarkupServices ; if(ms!=null) { IMarkupContainer pMC=null; IMarkupPointer pStart,pEnd; ms.CreateMarkupPointer(out pStart); ms.CreateMarkupPointer(out pEnd); StringBuilder sb=new StringBuilder(s); IntPtr pSource=Marshal.StringToHGlobalUni(s); ms.ParseString(ref *(ushort*)pSource.ToPointer(),0,out pMC,pStart,pEnd); if(pMC!=null) { Marshal.Release(pSource); return pMC as IHTMLDocument2; } Marshal.Release(pSource); } } return null; }
| | 寫代碼的時(shí)候出了一點(diǎn)問題,IMarkupService::ParseString第一個(gè)參數(shù)是ref ushort,顯然要傳入HTML代碼,這個(gè)ushort必須是第一個(gè)WideChar了,所以這里通過使用不安全代碼來繞過編譯器警告。
|