2010-04-27 5 views
7

Мне нужно создать рассылку по URL-адресу. I следующим образом:Относительно абсолютных путей в HTML (asp.net)

  1. Создать веб-клиент;
  2. Использование метода WebClient DownloadData, чтобы получить источник страницы в массиве байтов;
  3. Получить строку из источника-html байт массив и установить его в информационный бюллетень .

Но у меня есть проблемы с дорожками. Источники всех элементов были относительными (/img/welcome.png), но мне нужно абсолютное (http://www.mysite.com/img/welcome.png).

Как это сделать?

С уважением, Алекс.

ответ

6

Одним из возможных путей решения этой задачи является использование библиотеки HtmlAgilityPack.

Некоторые примеры (починки ссылки):

WebClient client = new WebClient(); 
byte[] requestHTML = client.DownloadData(sourceUrl); 
string sourceHTML = new UTF8Encoding().GetString(requestHTML); 

HtmlDocument htmlDoc = new HtmlDocument(); 
htmlDoc.LoadHtml(sourceHTML); 

foreach (HtmlNode link in htmlDoc.DocumentNode.SelectNodes("//a[@href]")) 
{ 
    if (!string.IsNullOrEmpty(link.Attributes["href"].Value)) 
    { 
     HtmlAttribute att = link.Attributes["href"]; 
     att.Value = this.AbsoluteUrlByRelative(att.Value); 
    } 
} 
+3

Мой скрипт не находит this.AbsoluteUrlByRelative – ram4nd

0

У вас есть несколько вариантов:

  1. Вы можете преобразовать массив байтов в строку и найти замену.
  2. Вы можете создать объект DOM, преобразовать массив байтов в строку, загрузить его и добавить значение к необходимым атрибутам (в основном вы ищете любой атрибут src, href, который не имеет http: или https: in Это).
 
    Console.Write(ControlChars.Cr + "Please enter a Url(for example, http://www.msn.com): ") 
    Dim remoteUrl As String = Console.ReadLine() 
    Dim myWebClient As New WebClient() 
    Console.WriteLine(("Downloading " + remoteUrl)) 
    Dim myDatabuffer As Byte() = myWebClient.DownloadData(remoteUrl) 
    Dim download As String = Encoding.ASCII.GetString(myDataBuffer) 
    download.Replace("src=""/", "src=""" & remoteUrl & "/") 
    download.Replace("href=""/", "href=""" & remoteUrl & "/") 
    Console.WriteLine(download) 
    Console.WriteLine("Download successful.") 

Это супер надуманное и фактически главная тяжесть этого берется непосредственно из: http://msdn.microsoft.com/en-us/library/xz398a3f.aspx но он иллюстрирует основной принцип позади метода 1.

+0

Спасибо, я знаю способ, как это, но я надеялся, что есть еще более простой способ сделать это =) –

2

если запрос приходит с вашего сайта (то же самое домен ссылка), то вы можете использовать это:

new Uri(Request.Uri, "/img/welcome.png").ToString(); 

Если вы в не веб-приложении, или вы хотите, чтобы жёстко имени домена:

new Uri("http://www.mysite.com", "/img/welcome.png").ToString(); 
+0

Мне нужно заменить все элементы src и href в html, что я получаю не только один путь. –

0

Просто использовать эту функцию

'# converts relative URL ro Absolute URI 
    Function RelativeToAbsoluteUrl(ByVal baseURI As Uri, ByVal RelativeUrl As String) As Uri 
     ' get action tags, relative or absolute 
     Dim uriReturn As Uri = New Uri(RelativeUrl, UriKind.RelativeOrAbsolute) 
     ' Make it absolute if it's relative 
     If Not uriReturn.IsAbsoluteUri Then 
      Dim baseUrl As Uri = baseURI 
      uriReturn = New Uri(baseUrl, uriReturn) 
     End If 
     Return uriReturn 
    End Function 
0

Вместо решения/завершения относительные пути, вы можете попытаться установить базовый-элемент с href-attrib = исходный baseURI, о котором идет речь.

Размещено в качестве первого дочернего элемента заголовка, все последующие относительные пути должны быть разрешены браузером, чтобы указать на исходное место назначения, а не на место, откуда находится/находится информационный бюллетень.

на firefox, некоторые таутологические (< - в формальной логике), чтобы получить/установить все атрибуты src/href-атрибутов, когда COMPLETE-пути записываются во все слои (сериализованные) html-doc, таким образом, с возможностью записи, сохранения ...:

var d=document; 
var n= d.querySelectorAll('[src]'); // do the same for [href] ... 
var i=0; var op ="";var ops=""; 
for (i=0;i<n.length;i++){op = op + n[i].src + "\n";ops=n[i].src; 
n[i].src=ops;} 
alert(op); 

Конечно, гиперссылка() - функ базисы, приведенные в СТИЛЕ-Element (s, - для фона IMG или контент-правил), а также в стиле-Attrib-х на уровне узла и в частности, значения url() - func-src/href НЕ рассматриваются/протестированы ни одним из вышеперечисленных решений.

Поэтому, чтобы получить подход base-Elem к действительному, проверенному (совместимому списку) состоянию, кажется более перспективным для меня.

Смежные вопросы