2017-02-06 3 views
-2

У меня есть HTML-файл, который выглядит следующим образом:C# HtmlAgilityPack получить содержание от всех DIV с данным классом

<div class="user_meals"> 
<div class="name">Name Surname</div> 
<div class="day_meals"> 
    <div class="meal">First Meal</div> 
</div> 
<div class="day_meals"> 
    <div class="meal">Second Meal</div> 
</div> 
<div class="day_meals"> 

    <div class="meal">Third Meal</div> 

</div> 
<div class="day_meals"> 

    <div class="meal">Fourth Meal</div> 

</div> 

<div class="day_meals"> 

    <div class="meal">Fifth Meal</div> 

</div> 

Этот код повторяется несколько раз.

Я хочу, чтобы получить Имя и Фамилия, которая находится между <div> теге с «именем» класса.

Это мой код, используя HtmlAgilityPack:

HtmlDocument doc = new HtmlDocument(); 
doc.LoadHtml(@"C:\workspace\file.html"); 

foreach (HtmlNode node in doc.DocumentNode.SelectNodes("//div[@class='name']")) 
{ 
    string vaule = node.InnerText; 
} 

Но на самом деле это не работает. Visual Studio бросает меня Исключение:

Необработанное исключение типа 'System.NullReferenceException'.

ответ

0

Вы используете неправильный метод для загрузки HTML с пути LoadHtml ожидать HTML, а не местоположение файла. Вместо этого используйте Load.

Ошибка, которую вы получаете, довольно вводит в заблуждение, поскольку все свойства не являются нулевыми, а стандартные советы от What is a NullReferenceException, and how do I fix it? не применяются.

По существу, это происходит от того, SelectNodes правильно возвращает null так как не элементы, соответствующие запросу и foreach бросает на него.

Исправлен код:

HtmlDocument doc = new HtmlDocument(); 
// either doc.Load(@"C:\workspace\file.html") or pass HTML: 
doc.LoadHtml("<div class='user_meals'><div class='name'>Name Surname</div></div> "); 
var nodes = doc.DocumentNode.SelectNodes("//div[@class='name']"); 
// SelectNodes returns null if nothing found - may need to check 
if (nodes == null) 
{ 
    throw new InvalidOperationException("Where all my nodes???");  
} 
foreach (HtmlNode node in nodes) 
{ 
    string vaule = node.InnerText; 
    vaule.Dump(); 
} 
Смежные вопросы