由于性能问题,我正在将PHP脚本解析为C#。
这是我遇到问题的PHP源代码:
$dom = new DOMDocument;
$dom->loadHTML($message);
foreach ($dom->getElementsByTagName('a') as $node) {
if ($node->hasAttribute('href')) {
$link = $node->getAttribute('href');
if ((strpos($link, 'http://') === 0) || (strpos($link, 'https://') === 0)) {
$add_key = ((strpos($link, '{key}') !== false) || (strpos($link, '%7Bkey%7D') !== false));
$node->setAttribute('href', $url . 'index.php?route=ne/track/click&link=' . urlencode(base64_encode($link)) . '&uid={uid}&language=' . $data['language_code'] . ($add_key ? '&key={key}' : ''));
}
}
}
我遇到的问题是getElementByTagName
部分。
正如here所述,我应该使用htmlagilitypack。到目前为止我的代码是:
var doc = new HtmlAgilityPack.HtmlDocument();
doc.LoadHtml(leMessage);
leMessage
是一个包含HTML的字符串。到现在为止还挺好。唯一的问题是HtmlAgillityPack中没有getElementsByTag
函数。在正常的HtmlDocument(没有包)中,我不能将字符串用作html页面吗?
那么有人知道我应该做些什么来使这项工作?我现在唯一能想到的就是在windows窗体中创建一个webbrowser并将文档内容设置为leMessage
,然后从那里解析它。但我个人不喜欢那种解决方案......但如果没有其他办法......
答案 0 :(得分:1)
以下是当我关注您的链接并点击“示例”时弹出的第一个页面顶部代码块:
HtmlDocument doc = new HtmlDocument();
doc.Load("file.htm");
foreach(HtmlNode link in doc.DocumentElement.SelectNodes("//a[@href"])
{
HtmlAttribute att = link["href"];
// DO SOMETHING WITH THE LINK HERE
}
doc.Save("file.htm");
将来请用谷歌搜索。