2010-04-27 25 views
7

URL'ye göre bir bülten oluşturmam gerekiyor. Sonraki yapmak için:HTML'de mutlak yollarla ilgili (asp.net)

  1. WebClient;
  2. Bayt dizisinde sayfa kaynağı almak için WebClient'in yöntemini kullanın DownloadData;
  3. source-html bayt dizisinden dize alın ve bülteni içeriğine ayarlayın.

Ama yollarla bazı sıkıntılarım var. Tüm elementlerin kaynakları göreceli (/img/welcome.png) ama mutlak (http://www.mysite.com/img/welcome.png) ihtiyacım var.

Bunu nasıl yapabilirim?

Saygılarımızla, Alex.

cevap

6

Bu görevi çözmenin olası yollarından biri HtmlAgilityPack kitaplığının kullanılmasıdır.

bazı örnek (düzeltme bağlantılar):

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

Komut dizim bunu bulamıyor.AbsoluteUrlByRelative – ram4nd

0

Bazı seçenekler vardır:

  1. Bir dizeye sizin bayt dizisi dönüştürmek ve değiştirmek bulabilirsiniz.
  2. Bir DOM nesnesi oluşturabilir, bayt dizisini dizeye dönüştürebilir, yükleyebilir ve değeri gereken yerlere ekleyebilirsiniz (temel olarak http: veya https: bulunmayan src, href nitelikleri arıyorsanız o).
 
    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.") 

Bu süper yapmacık ve aslında ana darbesini doğrudan alınır: http://msdn.microsoft.com/en-us/library/xz398a3f.aspx fakat bu talep sitenizden (aynı gelirse o yönteme 1.

+0

Teşekkürler, bu şekilde biliyorum, ama bunu yapmak için daha kolay bir yol olduğunu umuyorum =) –

2

temelinde yatan mantık göstermektedir domain bağlantılar) o zaman bu kullanabilirsiniz:

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

olmayan bir web uygulaması konum veya alan adı hardcode isterseniz:

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

html'deki tüm elemanların src ve href'lerini değiştirmem gerek, sadece bir yol değil. –

0

Sadece bu işlevi

'# 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

kullanmak yerine/göreli yollarını tamamladıktan sonra artık birlikte baz eleman ayarlamak için deneyebilirsiniz X'nun href-attrib = söz konusu orijinal baseURI.

Başlık öğesinin ilk alt öğesi olarak yerleştirilen, aşağıdaki tüm göreli yollar, belgenin (haber bülteninin) bulunduğu/gelmediği yere değil, orijinal varış noktasına yönlendirmek için tarayıcı tarafından çözümlenmelidir. firefox

, bazı ileri-geri gereksiz tekrar yapan (formel mantık -in <) yakalanma/tüm src/href-ATTRIBS ayarı, html-doc tüm katmanları (tefrika) yazılır TAM yolları olan tekrar başladı Böylece, betimlenebilir, ...:

Elbette
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); 

, url() - STİL-Element'te verildiği gibi fonk bazlar (s, - arka-img veya içerik kuralları için) yanı sıra düğüm seviyesinde stil attrib içinde en ve özellikle, url() - func tarafından belirtilen src/href değerleri, yukarıdaki çözümlerin hiçbiri tarafından dikkate alınmamıştır/test edilmemiştir. Bu nedenle, temel-Elem yaklaşımını geçerli, test edilmiş (uyumlu liste) bir duruma getirebilmek için bana daha umut verici bir kavram gibi görünmektedir.