2010-04-27 12 views
7

में पूर्ण पथ से संबंधित मुझे यूआरएल द्वारा न्यूजलेटर बनाने की जरूरत है। मैं आगे करता हूं:एचटीएमएल (एएसपीनेट)

  1. वेब क्लाइंट बनाएं;
  2. वेब क्लाइंट की विधि डाउनलोड डेटा को पृष्ठ का बाइट सरणी में प्राप्त करने के लिए डाउनलोड करें;
  3. स्रोत-एचटीएमएल बाइट सरणी से स्ट्रिंग प्राप्त करें और इसे न्यूज़लेटर सामग्री पर सेट करें।

लेकिन मुझे पथों के साथ कुछ परेशानी है। सभी तत्वों के स्रोत रिश्तेदार थे (/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

मेरी स्क्रिप्ट को यह नहीं मिला। AbsoluteUrlByRelative – ram4nd

0

आप कुछ विकल्प हैं:

  1. आप एक स्ट्रिंग के लिए अपनी बाइट सरणी बदलने और की जगह पा सकते हैं।
  2. आप एक डॉम ऑब्जेक्ट बना सकते हैं, बाइट सरणी को स्ट्रिंग में परिवर्तित कर सकते हैं, इसे लोड कर सकते हैं और जहां आवश्यक हो वहां गुणों को मान जोड़ सकते हैं (मूल रूप से आप किसी भी स्रोत, href विशेषता के लिए देख रहे हैं जिसमें http: या https: नहीं है यह)।
 
    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

मुझे HTML में सभी तत्वों के src और href को प्रतिस्थापित करने की आवश्यकता है जो मुझे केवल एक पथ नहीं मिलता है। –

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 = प्रश्न में मूल आधार।

शीर्षलेख-तत्व के पहले बच्चे के रूप में रखा गया है, तो सभी निम्नलिखित सापेक्ष पथ ब्राउज़र द्वारा मूल गंतव्य पर इंगित करने के लिए हल किए जाने चाहिए, न कि जहां दस्तावेज़ (न्यूजलेटर) स्थित है/कहां से आता है।

फ़ायरफ़ॉक्स पर, कुछ tautologic (<-औपचारिक तर्क) सभी स्रोत/href-attribs प्राप्त करने/सेट करने के लिए और एचटीएमएल-डॉक्टर के सभी परतों (क्रमबद्ध) में लिखे गए पूर्ण पथ में फिर से शुरू होते हैं, इस प्रकार पटकथा योग्य, बचाया जा सकता है ...:

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); 
बेशक

, यूआरएल() - स्टाइल-तत्व के रूप में दी समारोह अड्डों (रों, - पृष्ठभूमि img या सामग्री-नियमों के लिए) के साथ ही शैली के attrib में नोड के स्तर पर है और विशेष रूप से url() - func-said src/href-values ​​को ऊपर दिए गए किसी भी समाधान द्वारा समर्थित/परीक्षण नहीं किया जाता है।

इसलिए, वैध, परीक्षण (compat-list) स्थिति में बेस-एलेम दृष्टिकोण प्राप्त करने के लिए, मुझे अधिक आशाजनक धारणा दिखाई देती है।

संबंधित मुद्दे