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