создать словарь или список из строки (включая HTML-тег) в С#

Есть такая строка:

string s = @"
    <tr>
    <td>11</td><td>12</td>
    </tr>
    <tr>
    <td>21</td><td>22</td>
    </tr>
    <tr>
    <td>31</td><td>32</td>
    </tr>";

Как создать Dictionary<int, int> d = new Dictionary<int, int>(); из строки s, чтобы получить тот же результат, что и:

d.Add(11, 12);
d.Add(21, 22);
d.Add(31, 32);

person loviji    schedule 07.03.2010    source источник
comment
‹Подсказка›Вы можете попробовать поместить эту строку во фрагмент XML и просмотреть ее, чтобы получить числа. Затем добавить их в список тривиально. Грязным способом было бы использование Regex или даже вложенного String.split(), но это безумие. Кстати, это домашнее задание?   -  person Andrew M    schedule 07.03.2010
comment
спасибо, за идею. это не домашнее задание. я получаю эту проблему при создании приложения. что значит кстати, я не знаю :)   -  person loviji    schedule 07.03.2010


Ответы (4)


Вам следует использовать HTML Agility Pack.

Например: (Проверено)

var doc = new HtmlDocument();
doc.LoadHtml(s);
var dict = doc.DocumentNode.Descendants("tr")
              .ToDictionary(
                  tr => int.Parse(tr.Descendants("td").First().InnerText),
                  tr => int.Parse(tr.Descendants("td").Last().InnerText)
              );

Если HTML всегда будет правильно сформирован, вы можете использовать LINQ-to-XML; код будет почти идентичным.

person SLaks    schedule 07.03.2010
comment
очень полезные советы и ответы. и я узнаю о HTML Agility Pack. Лучшее решение для подобных задач. Спасибо - person loviji; 07.03.2010

Код

using RE=System.Text.RegularExpressions;

....

public void Run()
{
    string s=@"
<tr>
<td>11</td><td>12</td>
</tr>
<tr>
<td>21</td><td>22</td>
</tr>
<tr>
<td>31</td><td>32</td>
</tr>";

    var mcol= RE.Regex.Matches(s,"<td>(\\d+)</td><td>(\\d+)</td>");
    var d = new Dictionary<int, int>();

    foreach(RE.Match match in mcol)
        d.Add(Int32.Parse(match.Groups[1].Value),
              Int32.Parse(match.Groups[2].Value));

    foreach (var key in d.Keys)
        System.Console.WriteLine("  {0}={1}", key, d[key]);
}
person Cheeso    schedule 07.03.2010
comment
Вы не должны этого делать. Если вы это сделаете, вам, вероятно, следует игнорировать пробелы в тегах. stackoverflow .com/questions/1732348/ - person SLaks; 07.03.2010
comment
Возможно, но это сработало для его HTML. Я думаю, вы говорите, что это не будет работать для другого HTML. Честная оценка. - person Cheeso; 08.03.2010

Если вы не хотите использовать пакет гибкости HTML, вы можете попробовать что-то похожее на:

var arr = s.Replace("<tr>", "").Split("</tr", StringSplitOptions.RemoveEmptyEntries);

var d = new Dictionary<int, int>();
foreach (var row in arr) {
  var itm = row.Replace("<td>", "").Split("</td>", StringSplitOptions.RemoveEmptyEntries);
  d.Add(int.Parse(itm[0]), int.Parse(itm[1]);
}

(не проверено)

person Sani Singh Huttunen    schedule 07.03.2010
comment
Как упомянул Эндрю М, на этом пути лежит безумие. Это эквивалентно использованию регулярных выражений. codinghorror.com/blog/2009/11/ parsing-html-the-cthulhu-way.html - person TrueWill; 07.03.2010

используя RE=System.Text.RegularExpressions;

....

public void Run() {строка s=@" 1112 2122 3132 ";

var mcol= RE.Regex.Matches(s,"<td>(\\d+)</td><td>(\\d+)</td>"); 
var d = new Dictionary<int, int>(); 

foreach(RE.Match match in mcol) 
    d.Add(Int32.Parse(match.Groups[1].Value), 
          Int32.Parse(match.Groups[2].Value)); 

foreach (var key in d.Keys) 
    System.Console.WriteLine("  {0}={1}", key, d[key]); 

}

person user286275    schedule 08.03.2010