Извлечение и подсчет значения позиции из указанного узла-потомка - PullRequest
0 голосов
/ 25 февраля 2012

Из этого источника XHTML:

<div class = "page">  
<h1>UNIQUE NAME</h1>
  <table>
    <tbody>
      <tr>
        <td>DATA TO EXTRACT 1</td>
      </tr>
      <tr>
        <td />
        <td />
        <td />
        <td />
        <td />
        <td>DATA TO EXTRACT 2</td>
      </tr>
    </tbody>
 </table>
 etc...

Существует несколько экземпляров уникального имени с похожим набором дочерних элементов.

Мне нужно найти элемент UNIQUE NAME и извлечь все значения (DATA TO EXTRACT) в каждом из тегов дочернего элемента.Кроме того, мне нужно вести учет того, где находится каждое значение.Например, данные для извлечения 1 будут в tr 1, td 1. Данные для извлечения 2 будут в tr 2, td 6.

Я новичок в linq to xml, и мне было интересно, может ли кто-нибудь указать мнев правильном направлении по отношению к стратегии.Мне удалось выяснить, как добраться до элемента UNIQUE name с помощью следующего кода:

var choice1 = (from category in _data.Descendants("div")
                       where category.Element("h1").Value == "UNIQUE NAME"
                       select category).DescendantNodes();

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

Большое спасибо!

1 Ответ

0 голосов
/ 25 февраля 2012

Вот один из способов сделать это с помощью LINQ:

var choice1 =
    from category in _data.Descendants("div")
    where category.Element("h1").Value == "UNIQUE NAME"
    from row in category.Descendants("tr").Select((element, index) => new { element, index })
    from col in row.element.Elements("td").Select((element, index) => new { element, index })
    where !string.IsNullOrEmpty(col.element.Value)
    select new
    {
        RowIndex = row.index + 1,   // one-based index
        ColIndex = col.index + 1,
        Value = col.element.Value,
    };

Пример того, как использовать ваши результаты:

foreach (var v in choice1)
    Console.WriteLine(string.Format(
        "RowIndex = {0}, ColIndex = {1}, Value = \"{2}\".",
        v.RowIndex, v.ColIndex, v.Value));

… который будет выводить:

RowIndex = 1, ColIndex = 1, Value = "DATA TO EXTRACT 1".
RowIndex = 2, ColIndex = 6, Value = "DATA TO EXTRACT 2".
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...