日韩黑丝制服一区视频播放|日韩欧美人妻丝袜视频在线观看|九九影院一级蜜桃|亚洲中文在线导航|青草草视频在线观看|婷婷五月色伊人网站|日本一区二区在线|国产AV一二三四区毛片|正在播放久草视频|亚洲色图精品一区

分享

C#中利用Markup Service實(shí)現(xiàn)HTML解析為DOM Tree

 duduwolf 2005-09-25
一個(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了,所以這里通過使用不安全代碼來繞過編譯器警告。

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多