【问题标题】:How to edit a attribute of all of the special html tags(like a)如何编辑所有特殊 html 标签的属性(如 a)
【发布时间】:2012-02-03 20:02:29
【问题描述】:

我正在尝试使用 c# 编辑所有特殊 html 标记(如 a)的属性。例如我想更改此代码:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
    <title>Untitled Page</title>
</head>
<body>
    <a href="http://google.com"></a>
    <a href="http://gmail.com"></a>
</body>
</html>

到这里:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
    <title>Untitled Page</title>
</head>
<body>
    <a href="http://go.go/default.aspx?url=http://google.com">
    </a><a href="http://go.go/default.aspx?url=http://gmail.com"></a>
</body>
</html>

这意味着我想在&lt;a&gt; 中附加href 的值

我尝试了 LinqToXML,但它不起作用,因为 HTML 不是有效的 XML(因为 DOCTYPE 标签)

这是我的代码:

XDocument xmlFile = XDocument.Load(s);

var query = from c in xmlFile.Elements("html").Elements("body").Elements("a")
            select c;

foreach (XElement book in query)
{
    string atr = book.Attribute("href").Value;
    book.Attribute("href").Value = "http://ahmadalli.somee.com/default.aspx?url=" + atr;
}

xmlFile.Save(s);

s 是我的 html 流。

有谁知道我该怎么做?

我想在 ASP.NET 中有这段代码

【问题讨论】:

  • 我知道它不是 C#,但也许 jQuery 会更好地满足您的需求?但是,您似乎需要保存 html 内容。在这种情况下,请按照以下建议使用 HTMLAgility Pack
  • @Bertvan:请参阅我想从我的网站创建所有链接。然后将用户重定向到原始网站。

标签: c# asp.net html c#-4.0


【解决方案1】:

看看HTML Agility Pack

什么是 Html Agility Pack (HAP)?

这是一个敏捷的 HTML 解析器,它构建一个读/写 DOM 并支持普通的 XPATH 或 XSLT(实际上你不必了解 XPATH 或 XSLT 就可以使用它,不用担心......)。它是一个 .NET 代码库,可让您解析“网络之外”的 HTML 文件。解析器对“真实世界”格式错误的 HTML 非常宽容。对象模型与 System.Xml 的提议非常相似,但用于 HTML 文档(或流)。

下载包含几个示例项目 - 查看它们以了解如何操作 HTML 文件。

【讨论】:

  • @ahmadali shafiee:它不需要 asp.net,它只是你的普通 .net 类库。
  • @Oded:如何使用 HTML Agility Pack 做到这一点?
  • @ahmadalishafiee - 查看下载中的示例。
  • @ahmadalishafiee - 你需要仔细阅读我发布的内容。当您下载 HTML Agility Pack 时,在下载中,有示例 Visual Studio 项目可以做各种事情。看看他们,阅读他们,向他们学习。
【解决方案2】:

您可以简单地搜索每个 http://https:// 并根据需要进行更改。

您应该使用Microsoft.VisualBasic.Strings 函数。

详细了解 Microsoft.VisualBasic.Strings 函数here

这是一个示例代码:

string s; //store html content in this variable.

int i = Microsoft.VisualBasic.Strings.InStr(1, s.ToLower(), "http://");
int j1 = Microsoft.VisualBasic.Strings.InStr(i+1,s.ToLower(),"\""); 
int j2 = Microsoft.VisualBasic.Strings.InStr(i+1,s.ToLower(),"'");
int j;
if ((j1 < j2) && (j1 > i))
    j = j1;
else
    j = j2;

s = Microsoft.VisualBasic.Strings.Mid(s,1,i-1) + "http://www.go.go/default.aspx?url=" + Server.UrlEncode(Microsoft.VisualBasic.Strings.Mid(s,i,j-i)) + Microsoft.VisualBasic.Strings.Mid(s,j);

此代码会将第一个http:// 表单真实地址更改为您想要的地址。

您可以创建一个 while 循环并重复此操作以替换每个链接。 (记得排除http://www.go.go/default.aspx?

请注意,我的代码可能需要一些小改动。 (可能是i+1 而不是i 或类似的东西!)

编辑:这种方式有一些问题,例如,它不支持内部链接。您应该搜索标签(例如&lt;a)并处理其中的内部链接(直到&gt;)。

【讨论】:

  • 我认为有更好的方法来代替文本处理。
  • 我认为最好的方法是 Oded 的回答,但你说你不能使用那个库。
  • 不!我说我对 Html Agility Pack 的问题here
【解决方案3】:

将 runat="server" 放在标签中:

<a runat="server" ID="linkGmail" ....></a>

然后在您的代码中,您可以像这样更改 href 属性的值:

linkGmail.Attributes["href"] = "http://go.go/default.aspx?url=http://gmail.com";

【讨论】:

  • 你没听懂我在说什么
  • 您是否尝试解析 HTML 并替换所有出现的属性?我以为您的意思是要从 ASPX 页面中的代码中替换链接的 href 属性。不是这样吗?
  • 不。我正在下载stream 中的html 文件(网页),然后我想更改stream 链接的href 值。我想开发像PHProxy 这样的项目,但使用.net
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-09-28
  • 2013-05-28
  • 1970-01-01
  • 2018-01-27
相关资源
最近更新 更多