2011-01-20 2 views
1

У меня есть пара проблем с моим кодом, я пытаюсь вытащить каждый абзац со страницы, но на данный момент он выбирает только последний абзац.Html Agility Pack C# Проблема parsing абзаца

вот мой код.

foreach (HtmlNode node in doc.DocumentNode.SelectNodes("//div[@id='body']/p")) 
{ 
    string text = node.InnerText; 
    lblTest2.Text = text; 
} 

ответ

4

в цикле вы принимаете текущий InnerText узел и присваиваем его этикетке. Вы делаете это до каждого узла, поэтому, конечно, вы видите только последний - вы не сохраняете предыдущие.

Попробуйте это:

foreach (HtmlNode node in doc.DocumentNode.SelectNodes("//div[@id='body']/p")) 
{ 
    string text = node.InnerText; 
    lblTest2.Text += text + Environment.NewLine; 
} 
+0

спасибо, что сработал. – mintuz

+0

Это изменилось? doc (предполагая, что это из объявления типа «HtmlDocument doc = new HtmlDocument();» не работает для меня, в частности, у него нет члена «DocumentNode» ...? Это с совершенно новым NuGet из HtmlAgilityPack (версия 1.4.6.0) –

+0

@ B.ClayShannon - http://htmlagilitypack.codeplex.com/SourceControl/latest#Trunk/HtmlAgilityPack/HtmlDocument.cs <- он, конечно, выглядит так, как есть. – Oded

1

IMO, XPath - не забава. Я бы рекомендовал использовать синтаксис LINQ вместо:

foreach (var node in doc.DocumentNode 
    .DescendantNodes() 
    .Single(x => x.Id == "body") 
    .DescendantNodes() 
    .Where(x => x.Name == "p")) 
{ 
    string text = node.InnerText; 
    lblTest2.Text = text; 
} 
+0

мне потребовалось некоторое время, чтобы понять это. Посмотрите, что он делает в петле. – Oded

+0

@Oded, ах, да, приятно поймать. –