Как отредактировать атрибут всех специальных HTML-тегов (например, a) - PullRequest
2 голосов
/ 04 февраля 2012

Я пытаюсь отредактировать атрибут всех специальных HTML-тегов (например, a), используя c #. например, я хочу изменить этот код:

<!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>

Это означает, что я хочу добавить значение href в <a>

Я попробовал 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

Ответы [ 3 ]

6 голосов
/ 04 февраля 2012

Посмотрите на HTML Agility Pack .

Что такое Html Agility Pack (HAP)?

Это гибкий анализатор HTML, который создает DOM для чтения / записи и поддерживает простой XPATH или XSLT (вам на самом деле не нужно понимать XPATH или XSLT, чтобы его использовать, не волнуйтесь ...). Это библиотека кода .NET, которая позволяет анализировать HTML-файлы «из Интернета». Синтаксический анализатор очень терпим с искаженным HTML «реального мира». Объектная модель очень похожа на то, что предлагает System.Xml, но для документов HTML (или потоков).

Загрузка содержит несколько примеров проектов - ознакомьтесь с ними, чтобы узнать, как манипулировать файлом HTML.

1 голос
/ 21 февраля 2012

Вы можете просто искать все http:// и https:// и изменять их по мере необходимости.

Вам следует использовать Microsoft.VisualBasic.Strings функций.

Подробнее о Microsoft.VisualBasic.Строковые функции здесь .

Вот пример кода:

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 или что-то подобное!)

РЕДАКТИРОВАТЬ: Этот способ имеет некоторые проблемы, например, он не поддерживает внутренние ссылки. Вы должны искать теги (например, <a) и обрабатывать внутренние ссылки внутри него (до >).

0 голосов
/ 04 февраля 2012

Поместите runat = "server" в тег как таковой:

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

Затем в своем коде вы можете изменить значение атрибута href следующим образом:

linkGmail.Attributes["href"] = "http://go.go/default.aspx?url=http://gmail.com";
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...