2010-11-23 9 views
0

Im folgenden Beitrag habe ich die Beispiele folgte meine Httprequest und Listendateien aus WebServer Verzeichnis zu erstellen: C# HttpWebRequest command to get directory listingHttpWebRequest Befehl Verzeichnis erhalten Auflistung

Ich versuche, das Beispiel dort zu verwenden, um Dateien von meinem Web-Server zur Liste . Ich kann die Dateien von dem Beispielserver auflisten, der auf dem Link angegeben ist, aber mein Server zeigt nur die zuletzt hinzugefügte Datei an. Mein Code ist genau wie das Beispiel dort. Ich habe festgestellt, dass mein HTML-Code ein wenig anders ist. Jemand eine Idee hat:

<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 

Ich glaube, ich habe etwas in der Rückkehr von GetDirectoryListingRegexForUrl Methode ändern.

ist mein Code so etwas wie dieses:

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

Ich hoffe, dass Sie mir helfen können! Vielen Dank.

Antwort

1

Zwei Hauptprobleme hier.

1). Die Ausgabe einer solchen Anfrage ist völlig willkürlich und nicht einmal garantiert. Es ist die Sorge des Servers.

2). Regex ist not a suitable means zum Analysieren von HTML oder einer ähnlichen Struktur, da es sich nicht um eine normale Grammatik handelt. Ihre beste Wette, vorausgesetzt, Sie haben irgendeine Art von Zuverlässigkeit in Ihrer Antwort ist auf etwas wie die HtmlAgilityPack angewiesen, um ein strenges XHTML-Dokument zu erzwingen (möglicherweise nicht erforderlich, wenn Sie Glück haben) und dies als ein XML-Dokument mit XPath-Abfragen lesen . die Inhalte, die Sie interessiert sind, ziehen Sie

1

Hier ist der richtige regex:

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

es mit dem Original vergleichen:

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

das Problem liegt bei den Wiederholungsoperatoren .*, die standardmäßig gierig sind. Gierig bedeutet, dass sich die Regex so weit wie möglich ausdehnt, während sie nach einer Übereinstimmung sucht. Das heißt, es wird mit dem ersten <A beginnen und mit dem letzten A> in der Zeichenkette alles dazwischen reinlassen. Dass "alles" die anderen <A...A> 's in der Mitte beinhaltet.

Sie müssen angeben, dass die Wiederholungsoperatoren faul sind. Sie tun es, indem Sie ihnen ? wie .*? hinzufügen.

P.S. Das Analysieren von HTML mit regulären Ausdrücken ist notorisch eine schlechte Idee. Es ist in Ordnung, wenn Sie eine schnelle und schmutzige Reparatur benötigen, aber keine langfristige Lösung. Fügen Sie dazu die Tatsache hinzu, dass in Ihrem Fall die Ausgabe je nach Server und wahrscheinlich pro Server-Version variiert. Der Code ist nicht universell funktionsfähig. Bitte beachten Sie den anderen Ansatz, wie Sie direkt mit dem Server verhandeln, um eine Verzeichnisliste zu erhalten (wenn Sie natürlich Zugriff haben).

Und schließlich einige lustige Lese zum Thema:

Parsing Html The Cthulhu Way

RegEx match open tags except XHTML self-contained tags

+0

Vielen Dank, verschwendete ich viel Zeit, um die früheren regulären Ausdruck und es kehrte immer 1 Spiel. Der aktualisierte reguläre Ausdruck, der von Ihnen gegeben wurde, funktioniert großartig. –