Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ssis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在SSIS中将HTML作为数据源处理_Ssis - Fatal编程技术网

如何在SSIS中将HTML作为数据源处理

如何在SSIS中将HTML作为数据源处理,ssis,Ssis,如何处理SSIS包中的HTML源。在谷歌搜索之后,我在这里找到了一些答案 我试图遵循同样的方法,但没有达到预期的效果 请允许我在这方面得到帮助 提前谢谢这个问题很模糊,但这可能会让你开始 HTML是一种丰富的语言,因此您几乎肯定必须构建一个自定义解析器。您可以使用脚本转换作为数据源调用,以帮助将源解析为适当的格式,以便进行进一步的转换/目标。agility pack支持html->xml转换、XPATH、XSLT等,因此您不必编写太多自定义代码。Steve Homer的html agility

如何处理SSIS包中的HTML源。在谷歌搜索之后,我在这里找到了一些答案

我试图遵循同样的方法,但没有达到预期的效果

请允许我在这方面得到帮助


提前谢谢

这个问题很模糊,但这可能会让你开始


HTML是一种丰富的语言,因此您几乎肯定必须构建一个自定义解析器。您可以使用脚本转换作为数据源调用,以帮助将源解析为适当的格式,以便进行进一步的转换/目标。agility pack支持html->xml转换、XPATH、XSLT等,因此您不必编写太多自定义代码。

Steve Homer的html agility pack答案绝对值得研究。我自己从未尝试过,但codeplex的描述似乎令人鼓舞。话虽如此,以下是我过去使用C#script任务从intranet网页中刮取HTML页面以返回状态代码所做的工作:

        static bool GetTextBetweenTextBlocks(string input_expression, string left_text, string right_text, out string matched_text)
    {
        // Declare results variable.
        bool results = false;

        // Define the regular expression that needs to be found.
        string regex_find = left_text + "(?'text'.*?)" + right_text;

        // Match the string.
        Match string_output = Regex.Match(input_expression, regex_find);

        // Output results
        if (string_output.Success.ToString() == "True")
        {
            matched_text = string_output.ToString().Substring(left_text.Length, string_output.Length - left_text.Length - right_text.Length);
            results = true;
            return results;
        }
        else
        {
            matched_text = "";
            return results;
        }
    }
此函数将返回出现在其他两个文本字符串之间的第一个文本字符串。您可以根据自己的具体需要,用一个更有用的函数来代替它

 public void Main()
    {
        // Declare variables.
        int CaseSensitiveVariable = Convert.ToInt32(Dts.Variables["CaseSensitiveVariableFromPackage"].Value.ToString());
        string Internal_URL = "http://www.MySite.com/SomeWebPage.asp?cn=" + CaseSensitiveVariable.ToString("X");
        Boolean fireAgainFlag = true;
        Boolean StatusIWantToCheck = false;
        string SomethingIWantToCheck = "";

        // Try-Catch block.
        try
        {
            // The WebRequest.
            HttpWebRequest oWebrequest;
            oWebrequest = (HttpWebRequest)WebRequest.Create(Internal_URL);
            oWebrequest.Credentials = System.Net.CredentialCache.DefaultCredentials;
            oWebrequest.UserAgent = "My SSIS Server Name";
            oWebrequest.Method = "POST";
            oWebrequest.Timeout = (1000 * 60 * 10);
            oWebrequest.ProtocolVersion = HttpVersion.Version10;

            // The WebResponse.
            HttpWebResponse oWResponse;
            oWResponse = (HttpWebResponse)oWebrequest.GetResponse();
            Stream s = oWResponse.GetResponseStream();
            StreamReader sr = new StreamReader(s);
            String sReturnString = sr.ReadToEnd();
            oWResponse.Close();

            // Parse text for Pricing Plan section.  Change flag to true if Enterprise or Pro Shipper plans are found.
            bool includes_what_I_want_to_check = GetTextBetweenTextBlocks(sReturnString.Replace("\n", ""), "<td>Is it there?  Let's check for this.</td>", "</td>", out SomethingIWantToCheck);
            if (includes_what_I_want_to_check == true)
            {
                // Log what I want to check to the SSIS Events Log.
                Dts.Events.FireInformation(0, "Something I Want To Check", SomethingIWantToCheck, "", 0, ref fireAgainFlag);
                if (SomethingIWantToCheck.ToLower().Contains("Do I have this value?") || SomethingIWantToCheck.ToLower().Contains("Or Maybe I have this value?"))
                {
                    StatusIWantToCheck = true;
                }
            }
            else
            {
                // Log response and fail.
                Dts.Events.FireError(0, "I could not find what I wanted in the Web Response", sReturnString.Replace("\n", ""), "", 0);
                Dts.TaskResult = (int)ScriptResults.Failure;
            }
        }
        catch (WebException e)
        {
            Dts.Events.FireError(0, "WebException", e.Message, "", 0);
        }

        // Log variable and write value to the package variable.
        Dts.Events.FireInformation(0, "Status I Want to Check", StatusIWantToCheck.ToString(), "", 0, ref fireAgainFlag);
        Dts.Variables["StatusIWantToCheck"].Value = StatusIWantToCheck;

        // Return success.
        Dts.TaskResult = (int)ScriptResults.Success;
    }
public void Main()
{
//声明变量。
int CaseSensitiveVariable=Convert.ToInt32(Dts.Variables[“CaseSensitiveVariableFromPackage”].Value.ToString());
字符串内部URL=”http://www.MySite.com/SomeWebPage.asp?cn=“+CaseSensitiveVariable.ToString(“X”);
布尔值fireagaflagg=true;
布尔值StatusIWantToCheck=false;
字符串somethingWantToCheck=“”;
//试试挡块。
尝试
{
//WebRequest。
HttpWebRequest-oWebrequest;
oWebrequest=(HttpWebRequest)WebRequest.Create(内部URL);
oWebrequest.Credentials=System.Net.CredentialCache.DefaultCredentials;
oWebrequest.UserAgent=“我的SSIS服务器名称”;
oWebrequest.Method=“POST”;
oWebrequest.Timeout=(1000*60*10);
oWebrequest.ProtocolVersion=HttpVersion.Version10;
//网络回应。
HttpWebResponse-oWResponse;
oWResponse=(HttpWebResponse)oWebrequest.GetResponse();
流s=oWResponse.GetResponseStream();
StreamReader sr=新的StreamReader;
字符串sReturnString=sr.ReadToEnd();
oWResponse.Close();
//分析定价计划部分的文本。如果找到企业或专业发货人计划,则将标志更改为true。
bool包括\u我想要什么\u check=GetTextBetweenTextBlocks(sReturnString.Replace(“\n”,”),“它在那里吗?让我们检查一下。”,“”,out something wanttocheck);
if(包括我想要的内容检查==true)
{
//将要检查的内容记录到SSIS事件日志中。
Dts.Events.fireformation(0,“我想检查的东西”,somethingWantToCheck,”,0,ref fireagaflagg);
如果(SomethingIWantToCheck.ToLower()包含(“我有这个值吗?”)| SomethingIWantToCheck.ToLower()包含(“或者我有这个值?”)
{
StatusIWantToCheck=true;
}
}
其他的
{
//记录响应并失败。
Dts.Events.FireError(0,“我在Web响应中找不到所需内容”,sReturnString.Replace(“\n”,”),“,”,0);
Dts.TaskResult=(int)ScriptResults.Failure;
}
}
捕获(WebE例外)
{
Dts.Events.FireError(0,“WebException”,e.Message,”,0);
}
//记录变量并将值写入包变量。
Dts.Events.FireInformation(0,“我要检查的状态”,StatusIWantToCheck.ToString(),“”,0,ref fireagaflag);
Dts.Variables[“StatusIWantToCheck”]。值=StatusIWantToCheck;
//回归成功。
Dts.TaskResult=(int)ScriptResults.Success;
}
嗯。上面的代码块充满了您可能想要或不想要的东西。上面的代码执行网页的HTTP post,读取响应,搜索文本中的特定代码块,并使用IF-THEN-ELSE子句处理相关数据。它还包括将变量值写入包以跟踪发生的情况的示例。我依靠日志来排除错误,特别是在调整代码时。如果在脚本任务中找不到某些文本块,脚本任务也会设置为失败


祝您在尝试实施任何解决方案时好运。如果您对此代码片段有任何疑问,请告诉我。

Phil Factor提到了agility pack: