2010-11-23 31 views
0

在下面的文章中,我跟着例子來創建web服務器目錄我的HttpRequest和列表文件: C# HttpWebRequest command to get directory listing的HttpWebRequest命令來獲取目錄列表

我試圖使用的例子有,從我的Web服務器列表中的文件。我可以列出鏈接中引用的示例服務器中的文件,但我的服務器只顯示最後添加的文件。我的代碼就像那裏的例子。 我注意到我的html代碼有點不同。有人有一個想法:

<html> 
<head> 
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> 
    <title>186.215.156.154 - /download/Zatix/Zatix - Satisfação Geral/</title> 
</head> 
<body> 
    <h1> 
     186.215.156.154 - /download/Zatix/Zatix - Satisfação Geral/</h1> 
    <hr> 
    <pre> 
    <a href="/download/Zatix/">[Para a pasta superior]</a> 
    <br> 
    <br> 
    sexta-feira, 19 de novembro de 2010 11:17  52355 <a href="/download/Zatix/Zatix%20-%20Satisfa%C3%A7%C3%A3o%20Geral/Zatix%20-%20Satisfa%C3%A7%C3%A3o%20Geral_3_00.zip">Zatix - Satisfação Geral_3_00.zip</a><br>sexta-feira, 19 de novembro de 2010 11:17  52355 <a href="/download/Zatix/Zatix%20-%20Satisfa%C3%A7%C3%A3o%20Geral/Zatix%20-%20Satisfa%C3%A7%C3%A3o%20Geral_4_00.zip">Zatix - Satisfação Geral_4_00.zip</a> 
    <br> 
</pre> 
    <hr> 
</body> 
</html 

我想我必須要改變的東西在GetDirectoryListingRegexForUrl方法的返回。

我的代碼是這樣的:

private string GetDirectoryListingRegexForUrl(string url) 
{ 
    if (url.Equals(Url)); 
    { 
     return "<A HREF=\".*\">(?<name>.*)</A>";     
    } 
    throw new NotSupportedException(); 
} 

public void ListStudies() 
{ 
    Url = BaseUrl + this.clientName + "/" + this.activeStudy + "/"; 
    Console.WriteLine(Url); 
    CookieContainer cookies; 
    HttpWebResponse response; 
    HttpWebRequest req = (HttpWebRequest)System.Net.WebRequest.Create(Url);    

    req.Credentials = _NetworkCredential; 
    req.CookieContainer = new CookieContainer(); 
    req.AllowAutoRedirect = true; 
    cookies = req.CookieContainer; 

    try 
    { 
     response = (HttpWebResponse)req.GetResponse(); 

     if (response.StatusCode != HttpStatusCode.OK) 
      Console.WriteLine("URL NÃO RESPONDEU"); 
     else 
      Console.WriteLine("URL OK"); 

     using (response) 
     { 
      using (StreamReader reader = new StreamReader(response.GetResponseStream())) 
      { 
       string html = reader.ReadToEnd(); 
       Regex regex = new Regex(GetDirectoryListingRegexForUrl(Url)); 
       MatchCollection matches = regex.Matches(html);            

       if (matches.Count > 0) 
       { 
        foreach (Match match in matches) 
        { 
         if (match.Success) 
         { 
          Console.WriteLine(match.Groups["name"]);          
         }         
        } 
       } 
      } 
     } 
    } 
    catch (Exception e) 
    { 
     MessageBox.Show(e.Message, "Update Error", MessageBoxButtons.OK, MessageBoxIcon.Error); 
    }    
} 

我希望你能幫幫我!謝謝。

回答

1

這裏有兩個主要問題。

1)。像這樣的請求的輸出是完全任意的,甚至沒有保證。這是服務器的擔憂。 2)。正則表達式是not a suitable means解析HTML或任何類似的結構,因爲它不是一個正規的語法。假設您在響應中有任何可靠性,最好的方法是依靠像HtmlAgilityPack這樣的內容來執行嚴格的XHTML文檔(如果幸運的話可能不需要),並將其作爲帶有XPath查詢的XML文檔讀取。拔出你感興趣的內容

1

這裏是正確的正則表達式:

<A HREF=\".*?\">(?<name>.*?)</A> 

比較它原來的一個:

<A HREF=\".*\">(?<name>.*)</A> 

的問題在於重複操作.*默認貪婪。貪婪意味着正則表達式將盡可能擴展,同時尋找匹配。這意味着它將從第一個<A開始,並以字符串中的最後一個A>結束,讓所有內容都處於中間。「所有」包括其他<A...A>的中間。

您需要指定重複操作符是懶惰的。您可以通過向.*?添加?來完成。

P.S.用正則表達式解析HTML是一個糟糕的主意。沒關係,如果你需要一個快速和骯髒的修復,但沒有去尋求一個長期的解決方案。此外,事實上,在你的情況下,每臺服務器和每個服務器版本的輸出可能會有所不同。代碼不是通用的。請考慮另一種方法,如直接與服務器協商以獲取目錄列表(如果您有訪問權限)。

最後有些好笑讀取到塞馬:

Parsing Html The Cthulhu Way

RegEx match open tags except XHTML self-contained tags

+0

非常感謝,我使用的是早期的正則表達式浪費了大量的時間,它總是返回1場。由你給出的更新的正則表達式,工作真棒。 – 2013-10-16 09:15:22