65.9K
CodeProject 正在变化。 阅读更多。
Home

C# 中的 Internet Web 宏

starIconstarIcon
emptyStarIcon
starIcon
emptyStarIconemptyStarIcon

2.41/5 (6投票s)

2004年5月5日

2分钟阅读

viewsIcon

46950

downloadIcon

616

编写带有插件库用于数据处理的 Web 宏代理

引言

有时您需要在应用程序中检索/提交来自网络的信息,但您不想为此编写完整的库。您更愿意专注于您的特定需求,假设您已经以 HTML 或 mshtml DOM 格式从网络获取了信息。

因此,KUMO 是为您完成的。您可以在宏中调用您自己的对象,这些对象定义为插件,并且您可以将您的网络宏导出为 DLL 或 .EXE 对象。

背景

1998 年,Compaq 推出了一种 Web 语言来自动化网络上的操作。 http://research.compaq.com/SRC/WebL/。该项目停止了,现在有一些商业软件或 Java 框架提供网络自动化功能。不幸的是,.NET 上从未出现过任何重要的东西。

使用代码

该代码基于 KUMO 网络宏方法:网络宏是用修改后的 C# 指令编写的。宏的修改后的 C# 指令是 ## 指令,它仅仅意味着宏必须等待浏览器完成其他工作才能继续。## 指令的另一个属性是,不需要声明返回类型。网络宏使用 3 个对象:SPBrowserSPBrowserObjectSPBrowserCollectionSPBrowser 代表当前浏览器,而 SPBrowserObjectmshtml.IHTMLElement 对象的一个包装器,SPBrowserCollectionSPBrowserObject 的一个数组。

通过编写您自己的 .NET DLL,实现 KUMOFrwk.Plugin.IPlugin 接口,并将其放在 KUMO 安装文件夹下的 /Plugins 目录中,您将能够在 3 个对象 SPBrowserSPBrowserObjectSPBrowserCollection 上添加您自己的自定义方法。您将在 KUMO 编辑器中看到这些方法,该编辑器具有自动完成功能,可以识别插件。

为了给出一个简单的例子,我实现了稍后描述的插件 ContactPlugingetEmails() 函数

//
// Navigate to Google advertisement page
## browser.goToURL("http://www.google.com/jobs/eng.html"); 

## emails = browser.getEmails(); 
if (emails.Length>0) 
{ 
    MessageBox.Show(emails[0]); 
}

插件源代码可在下载源代码中获得。重要部分是函数 doFunction,KUMO 将启动它。此处定义的函数将在当前网页的所有对象中搜索看起来像电子邮件的对象。当然,有几种方法可以优化此函数以获得更快的速度,但这不是本文的重点。

public object doFunction(params object[] allparameters) 
{ 
    // In that case there is no need to use any of the input parameter. 
    string[] allEmails; 
    string strRegex = @"^([a-zA-Z0-9_\-\.]+)@((\[[0-9]{1,3}" 
      + @"\.[0-9]{1,3}\.[0-9]{1,3}\.)|(([a-zA-Z0-9\-]+\" + 
      @".)+))([a-zA-Z]{2,4}|[0-9]{1,3})(\]?)$"; 
    Regex emailReg = new Regex(strRegex); 
    doc = (mshtml.HTMLDocument)localBrowser.Document; 
    mshtml.IHTMLElementCollection allTags = doc.all; 
    System.Collections.Queue aQueue = new Queue(); 
    foreach (mshtml.IHTMLElement anObj in allTags) 
    { 
        if (anObj.innerText != null) 
        { 
            if (anObj.innerText != "") 
            { 
                if ((emailReg.IsMatch(anObj.innerText))&
                    (anObj.innerText!="")) aQueue.Enqueue(
                     anObj.innerText); 
            } 
         } 
    } 
    allEmails = new string[aQueue.Count]; 
    for (int i=0; i<aQueue.Count;i++) 
    { 
        allEmails[i]=(string)aQueue.Dequeue(); 
    } 
    return allEmails; 
 }

关注点

www.softmorning.net 上下载 KUMO

© . All rights reserved.