2010-04-27 45 views
7

Tôi cần tạo bản tin theo URL. Tôi phải làm tiếp theo:Tương đối với đường dẫn tuyệt đối trong HTML (asp.net)

  1. Tạo WebClient;
  2. Sử dụng phương pháp của WebClient Tải xuốngData để lấy nguồn trang trong mảng byte;
  3. Nhận chuỗi từ byte nguồn-html mảng và đặt nó thành bản tin nội dung.

Nhưng tôi gặp một số rắc rối với đường dẫn. Tất cả các nguồn của phần tử đều tương đối (/img/welcome.png) nhưng tôi cần tuyệt đối (http://www.mysite.com/img/welcome.png).

Tôi làm cách nào để thực hiện việc này?

Trân trọng, Alex.

Trả lời

6

Một trong những cách có thể để giải quyết nhiệm vụ này là sử dụng thư viện HtmlAgilityPack.

Một số ví dụ (liên kết sửa chữa):

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

Tập lệnh của tôi không tìm thấy tệp này.AbsoluteUrlByRelative – ram4nd

0

Bạn có một số tùy chọn:

  1. Bạn có thể chuyển đổi mảng byte của bạn vào một chuỗi và tìm thay thế.
  2. Bạn có thể tạo đối tượng DOM, chuyển mảng byte thành chuỗi, tải nó và chắp thêm giá trị vào thuộc tính khi cần (về cơ bản bạn đang tìm bất kỳ thuộc tính src, href nào không có http: hoặc https: trong nó).
 
    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.") 

Đây là siêu giả tạo và thực sự là gánh nặng chính của nó được lấy trực tiếp từ: http://msdn.microsoft.com/en-us/library/xz398a3f.aspx nhưng nó minh họa gốc cơ bản đằng sau phương pháp 1.

+0

Cảm ơn, tôi biết cách này, nhưng tôi hy vọng rằng có một cách dễ dàng hơn để làm điều đó =) –

2

nếu yêu cầu được lấy từ trang web của bạn (cùng liên kết tên miền) sau đó bạn có thể sử dụng này:

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

Nếu bạn đang ở trong một ứng dụng phi web, hoặc bạn muốn hardcode tên miền:

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

Tôi cần phải thay thế tất cả các phần tử src và href trong html những gì tôi nhận được không chỉ một con đường. –

0

Chỉ cần sử dụng chức năng này

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

Thay vì giải quyết/hoàn thành đường dẫn tương đối, bạn có thể cố gắng để thiết lập các phần tử cơ sở với href-attrib = baseURI ban đầu được đề cập.

Được đặt làm phần tử con đầu tiên của phần tử tiêu đề, tất cả các đường dẫn tương đối sau đây phải được trình duyệt giải quyết để trỏ đến đích ban đầu, chứ không phải vị trí của tài liệu (bản tin).

trên firefox, một số tautologic (< -in chính thức logics) và/hoặc của nhận/thiết lập của tất cả các src/href-attribs hồ sơ có đường dẫn COMPLETE được viết cho tất cả các lớp (serialized) của html-doc, do đó dễ hiểu, dễ hiểu ...:

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

Tất nhiên, url() - func căn cứ như được đưa ra trong STYLE-tử (s, - cho background-img hoặc nội dung quy định) cũng như trong phong cách-attrib tại nút cấp và cụ thể là url() - func-specified src/href-values ​​KHÔNG được xem xét/thử nghiệm bởi bất kỳ giải pháp nào ở trên.

Do đó, để có được cách tiếp cận cơ sở-Elem đến trạng thái hợp lệ, được kiểm tra (danh sách tương thích), có vẻ như khái niệm hứa hẹn hơn đối với tôi.

Các vấn đề liên quan