HtmlAgilityPack и выбор узлов и субнодов

c# html-agility-pack xpath

Вопрос

Надеюсь, кто-то может мне помочь.

Предположим, у меня есть html-документ, содержащий несколько div, подобных этому примеру:

<div class="search_hit">

    <span prop="name">Richard Winchester</span>
    <span prop="company">Kodak</span>
    <span prop="street">Arlington Road 1</span>

</div>
<div class="search_hit">

    <span prop="name">Ted Mosby</span>
    <span prop="company">HP</span>
    <span prop="street">Arlington Road 2</span>

</div>

Я использую HtmlAgilityPack, чтобы получить html-документ. Мне нужно знать, как я могу получить промежутки для каждого «search_hit» -div?

Моя первая мысль была примерно такой:

foreach (HtmlAgilityPack.HtmlNode node in doc.DocumentNode.SelectNodes("//div[@class='search_hit']"))
{
     foreach (HtmlAgilityPack.HtmlNode node2 in node.SelectNodes("//span[@prop]"))
     {

     }
}

Каждый div должен быть объектом с включенными пролетами как свойствами. I. e.

public class Record
    {
        public string Name { get; set; }
        public string company { get; set; }
        public string street { get; set; }
    }

И этот Список будет заполнен тогда:

public List<Record> Results = new List<Record>();

Но использование XPATH i''m не выполняет поиск в подзоне, как это должно быть. Он швыряет, что он снова и снова ищет весь документ.

Я имею в виду, что я уже работал таким образом, чтобы получить только пробелы всей страницы. Но тогда у меня нет отношения между пролетами и div. Значит: я больше не знаю, какой промежуток связан с div.

Кто-нибудь знает решение? Я уже играл так много, что теперь я полностью смущен :)

Любая помощь приветствуется!

Принятый ответ

Для меня работает следующее. Важный бит так же, как BeniBela отметил добавление точки во втором вызове «SelectNodes».

List<Record> lstRecords=new List<Record>();
foreach (HtmlNode node in doc.DocumentNode.SelectNodes("//div[@class='search_hit']"))
{
  Record record=new Record();
  foreach (HtmlNode node2 in node.SelectNodes(".//span[@prop]"))
  {
    string attributeValue = node2.GetAttributeValue("prop", "");
    if (attributeValue == "name")
    {
      record.Name = node2.InnerText;
    }
    else if (attributeValue == "company")
    {
      record.company = node2.InnerText;
    }
    else if (attributeValue == "street")
    {
      record.street = node2.InnerText;
    }
  }
  lstRecords.Add(record);
}

Популярные ответы

Если вы используете // , он ищет от начала документа.

Используйте .// для поиска всех из текущего узла

 foreach (HtmlAgilityPack.HtmlNode node2 in node.SelectNodes(".//span[@prop]"))

Или просто откройте префикс для поиска только для прямых детей:

 foreach (HtmlAgilityPack.HtmlNode node2 in node.SelectNodes("span[@prop]"))


Лицензировано согласно: CC-BY-SA with attribution
Не связан с Stack Overflow
Является ли этот КБ законным? Да, узнайте, почему
Лицензировано согласно: CC-BY-SA with attribution
Не связан с Stack Overflow
Является ли этот КБ законным? Да, узнайте, почему