2016-10-21 3 views
0

Ich habe Probleme, einige Schleifen zu machen.C# Nested Loops

Ich verwende Agilitypack. Ich habe eine TXT-Datei mit mehreren Links (1 pro Zeile) und für jeden Link, den txt zu der Seite navigieren möchte, und extrahiere ihn später, um in xpath zu sein und in ein Memo zu schreiben.

Das Problem, das ich habe und dass der Code nur das Verfahren für die letzte Zeile von txt ausführt. Wo liege ich falsch?

var Webget = new HtmlWeb(); 
foreach (string line in File.ReadLines("c:\\test.txt")) 
{ 
    var doc = Webget.Load(line); 
    foreach (HtmlNode node in doc.DocumentNode.SelectNodes("//*[@id='title-article']")) 
    { 
     memoEdit1.Text = node.ChildNodes[0].InnerHtml + "\r\n"; 
     break; 
    } 
} 
+0

Warum eine verschachtelte Schleife verwenden, wenn Sie mit 'break' drin .. –

Antwort

4

try

memoEdit1.Text = node.ChildNodes[0].InnerHtml + "\r\n"; 

zu

memoEdit1.Text += node.ChildNodes[0].InnerHtml + "\r\n"; 
+0

Danke, es hat geklappt, nicht auf dieses Detail richtig geachtet. –

+0

@KawyllainyVi Willkommen, glücklich zu helfen: D – tym32167

2

Sie memoEdit1.Text jedes Mal überschreiben zu ändern. Versuchen

memoEdit1.Text += node.ChildNodes[0].InnerHtml + "\r\n"; 

statt - beachten Sie die += statt =, die jedes Mal, wenn der neue Text ergänzt.

Übrigens ist das ständige Anhängen von Strings nicht wirklich der beste Weg. So etwas wie dies vielleicht besser:

var Webget = new HtmlWeb(); 
var builder = new StringBuilder(); 
foreach (string line in File.ReadLines("c:\\test.txt")) 
{ 
    var doc = Webget.Load(line); 
    foreach (HtmlNode node in doc.DocumentNode.SelectNodes("//*[@id='title-article']")) 
    { 
     builder.AppendFormat("{0}\r\n", node.ChildNodes[0].InnerHtml); 
     break; 
    } 
} 
memoEdit1.Text = builder.ToString(); 

Oder mit LINQ:

var Webget = new HtmlWeb(); 
memoEdit1.Text = string.Join(
    "\r\n", 
    File.ReadAllLines("c:\\test.txt") 
     .Select (line => Webget.Load(line).DocumentNode.SelectNodes("//*[@id='title-article']").First().ChildNodes[0].InnerHtml)); 
0

Wenn Sie nur die Auswahl 1 Knoten in der inneren Schleife dann SelectSingleNode Stattdessen verwenden. Auch die bessere Praxis als Zeichenfolgen in einer Schleife verkettet ist StringBuilder zu verwenden:

StringBuilder builder = new StringBuilder(); 

var Webget = new HtmlWeb(); 
foreach (string line in File.ReadLines("c:\\test.txt")) 
{ 
    var doc = Webget.Load(line); 
    builder.AppendLine(doc.DocumentNode.SelectSingleNode("//*[@id='title-article']").InnerHtml); 
} 

memoEdit1.Text = builder.ToString(); 

Linq Mit ihm wird wie folgt aussehen:

var Webget = new HtmlWeb(); 
var result = File.ReadLines("c:\\test.txt") 
    .Select(line => Webget.Load(line).DocumentNode.SelectSingleNode("//*[@id='title-article']").InnerHtml)); 

memoEdit1.Text = string.Join(Environment.NewLine, result);