文章分类 | 软件分类 | 最新软件 | 杀毒软件 | 实用软件  | MTV下载  | 设为首页 |
  | 下载分类 | 最近更新
您的位置: 首页 >> 文章首页 >> 技术开发 >> .Net 专栏 >> C#语言 >>  
C#语言点击TOP10
·使用Web服务将C#代码转换为VB.NET代码2006-2-9 18:10:39
·C#编写的windows计算器-源代码2006-2-10 16:08:20
·用Visual C#中实现DB2数据库编程2006-2-9 16:41:48
·C#中的非安全编程2006-2-9 17:32:38
·编程特例篇——LOGO语言2006-2-5 23:53:56
·Visual FoxPro 9中新的数据处理方式2006-2-6 7:50:17
·小议Windows CE 的下浏览器配置2006-2-6 7:50:09
·如何更好更快的debug2006-2-5 23:53:54
·利用c#制作简单的留言板22006-2-9 16:41:33
·C++中通过溢出覆盖虚函数指针列表执行代码2006-2-9 12:28:20
.Net 专栏点击TOP10
·ADO.net中数据库连接方式2006-2-9 17:35:03
·ASP.NET里的事务处理2006-2-5 12:41:30
·使用Web服务将C#代码转换为VB.NET代码2006-2-9 18:10:39
·十天学会ASP.net之第九天2006-2-6 10:10:06
·如何给DataGrid添加双题头分类显示2006-2-5 18:46:43
·使用嵌套的Repeater控件2006-2-5 12:41:52
·Net 下安装、调试的常见问题与错误2006-2-9 9:04:53
·在ASP.NET中值得注意的两个地方2006-2-9 16:40:07
·C#中的非安全编程2006-2-9 17:32:38
·ASP.NET中利用cookies保持客户端信息2006-2-9 17:33:25

 

C#中利用Markup Service实现HTML解析为DOM Tree
作者:我去下载           时间:2006-2-10 12:51:24


一个轻量级Parsing 实现。这个代码不会从网上下载任何资料,也不会执行任何脚本,纯属Parsing。
Parsing是通过MSHTML的Markup Service实现的。要正确使用这个代码,需要添加MSHTML引用。
由于.net中没有定义IPersistStreamInt接口,就必须自己实现,接口定义:
以下内容为程序代码:

[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();
}
 

以下内容为程序代码:

  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;
  }
 
 

写代码的时候出了一点问题,IMarkupService::ParseString第一个参数是ref ushort,显然要传入HTML代码,这个ushort必须是第一个WideChar了,所以这里通过使用不安全代码来绕过编译器警告。

分页:
相关文章:
Copyright© 2005-2006 wqxz.com, All Rights Reserved. 购买虚拟主机请与本站联系