Вложенные циклы C #

#c# #nested #html-agility-pack

#c# #вложенные #html-agility-pack

Вопрос:

У меня возникли проблемы с созданием некоторых циклов.

Я использую agilitypack. У меня есть текстовый файл с несколькими ссылками (по 1 на строку), и для каждой ссылки, по которой txt хочет перейти на страницу, а затем позже извлечь, чтобы быть в xpath и записать в заметку.

Проблема, с которой я столкнулся, и в том, что код выполняет процедуру только для последней строки txt. Где я не прав?

 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   "rn";
        break;
    }
}
  

Комментарии:

1. Зачем использовать вложенный цикл, если вы используете break в нем..

Ответ №1:

попробуйте изменить

 memoEdit1.Text = node.ChildNodes[0].InnerHtml   "rn";
  

Для

 memoEdit1.Text  = node.ChildNodes[0].InnerHtml   "rn";
  

Комментарии:

1. Спасибо, это сработало, не обратил внимания на эту деталь правильно.

2. @KawyllainyVi Добро пожаловать, рад помочь : D

Ответ №2:

Вы каждый раз перезаписываете memoEdit1.Text . Попробуйте

 memoEdit1.Text  = node.ChildNodes[0].InnerHtml   "rn";
  

вместо этого — обратите внимание на = вместо = , который каждый раз добавляет новый текст.

Кстати, постоянное добавление строк друг к другу на самом деле не лучший способ. Что-то вроде этого могло бы быть лучше:

 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}rn", node.ChildNodes[0].InnerHtml);
        break;
    }
}
memoEdit1.Text = builder.ToString();
  

Или, используя LINQ:

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

Ответ №3:

Если вы выбираете только 1 узел во внутреннем цикле, тогда используйте SelectSingleNode вместо этого. Также лучшей практикой при объединении строк в цикле является использование StringBuilder :

 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 это будет выглядеть следующим образом:

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