相对于HTML中的绝对路径(asp.net)

时间:2010-04-27 07:10:30

标签: asp.net html relative-path absolute-path

我需要通过网址创建简报。我接下来要做的事情:

  1. 创建WebClient;
  2. 使用WebClient的方法 DownloadData获取页面源 在字节数组中;
  3. 从source-html字节获取字符串 数组并将其设置为简报 内容。
  4. 但是我对路径有些麻烦。所有元素的来源都是相对的( /img/welcome.png ),但我需要绝对( http://www.mysite.com/img/welcome.png )。

    我该怎么做?

    最好的问候,Alex。

5 个答案:

答案 0 :(得分: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);
    }
}

答案 1 :(得分:2)

如果请求来自您的网站(相同的域名链接),那么您可以使用:

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

如果您使用的是非网络应用,或者您想对域名进行硬编码:

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

答案 2 :(得分:0)

你有一些选择:

  1. 您可以将字节数组转换为字符串并查找替换。
  2. 您可以创建一个DOM对象,将字节数组转换为字符串,加载它并将值附加到需要的属性(基本上您正在寻找任何没有http:或https:in的src,href属性它)。
  3.     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背后的基本原理。

答案 3 :(得分: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

答案 4 :(得分:0)

您可以尝试使用href-attrib =相关的原始baseURI来设置base-element,而不是解析/完成相对路径。

作为header-element的第一个子元素,所有后续相对路径应由浏览器解析为指向原始目标,而不是doc(newsletter)所在的位置。

在firefox上,获取/设置所有src / href-attribs的一些重复(< -in正式逻辑)来回恢复将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);

当然,url() - func基于STYLE-Element(s, - 用于background-img或content-rules)以及在节点级别的style-attrib,特别是url( )-func-stated src / href-values不被上述任何解决方案考虑/测试。

因此,要使base-Elem方法进入有效的,经过测试的(compat-list)状态,对我来说似乎是更有希望的概念。