C# 从C中的字符串(包括HTML标记)创建字典或列表#

C# 从C中的字符串(包括HTML标记)创建字典或列表#,c#,html-parsing,html-table,C#,Html Parsing,Html Table,A有如下字符串: 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&g

A有如下字符串:

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>";
你应该使用

例如:(已测试)


如果HTML总是格式良好的,那么可以使用LINQ到XML;代码几乎相同。

如果您不想使用HTML agility pack,可以尝试类似的方法:

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]);
}
var arr=s.Replace(“,”).Split(code

使用RE=System.Text.regular表达式;
....
公开募捐
{
字符串s=@“
1112
2122
3132
";
var mcol=RE.Regex.Matches,“(\\d+)(\\d+)”;
var d=新字典();
foreach(在mcol中重新匹配)
d、 添加(Int32.Parse(match.Groups[1].Value),
解析(match.Groups[2].Value));
foreach(d.Keys中的var键)
System.Console.WriteLine(“{0}={1}”,key,d[key]);
}
var s=“111221223132”;
var rows=s.Split(new[]{”“},StringSplitOptions.None);
var results=newdictionary();
foreach(行中的变量行)
{
var cols=row.Split(new[]{”“},StringSplitOptions.None);
var vals=新列表();
foreach(以cols为单位的变量col)
{
var val=col.Replace(“,string.Empty”).Replace(“,string.Empty);
int intVal;
if(内锥巴色(val,外锥巴色))
VAL.Add(intVal);
}
如果(VAL.Count==2)
结果:添加(VAL[0],VAL[1]);
}
字符串s=
@" 
1112
2122
3132
";
XPathDocument doc=新的XPathDocument(XmlReader.Create(新的StringReader,新的XmlReaderSettings{ConformanceLevel=ConformanceLevel.Fragment,IgnoreWhitespace=true});
Dictionary dict=doc.CreateNavigator()
.选择(“tr”)
.Cast()
.ToDictionary(
r=>r.SelectSingleNode(“td[1]”)。ValueAsInt,
r=>r.SelectSingleNode(“td[2]”)。ValueAsInt
);

使用RE=System.Text.regular表达式

公开募捐 { 字符串s=@“ 1112 2122 3132 “

var mcol=RE.Regex.Matches,“(\\d+)(\\d+)”;
var d=新字典();
foreach(在mcol中重新匹配)
d、 添加(Int32.Parse(match.Groups[1].Value),
解析(match.Groups[2].Value));
foreach(d.Keys中的var键)
System.Console.WriteLine(“{0}={1}”,key,d[key]);

}

您可以尝试将该字符串放入一个XML片段中,并遍历它以获取数字。然后将它们添加到列表中是很简单的。肮脏的方法是使用正则表达式,甚至是嵌套字符串。split(),但那样的话就是谎言。这是家庭作业吗?顺便说一句?谢谢你的想法。这不是家庭作业。我在创建应用程序时遇到了这个问题。顺便说一句,我不知道这是什么意思:)正如Andrew M所提到的,这种方式是疯狂的。它相当于使用正则表达式。你不应该这样做。如果你这样做,你可能应该忽略标记中的空白。也许,但它对他的HTML有效。我想你是说它对其他HTML不起作用。公平点。非常有用的提示和答案。我还了解了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)
              );
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]);
}
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]);
}
var 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 rows = s.Split( new[] { "</tr>" }, StringSplitOptions.None );

var results = new Dictionary<int, int>();
foreach ( var row in rows )
{
    var cols = row.Split( new[] { "</td>" }, StringSplitOptions.None );
    var vals = new List<int>();

    foreach ( var col in cols )
    {
        var val = col.Replace( "<td>", string.Empty ).Replace( "<tr>", string.Empty );

        int intVal;
        if ( int.TryParse( val, out intVal ) )
            vals.Add( intVal );
    }

    if ( vals.Count == 2 )
        results.Add( vals[0], vals[1] );
}
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>";

XPathDocument doc = new XPathDocument(XmlReader.Create(new StringReader(s), new XmlReaderSettings { ConformanceLevel = ConformanceLevel.Fragment, IgnoreWhitespace = true }));

Dictionary<int, int> dict = doc.CreateNavigator()
   .Select("tr")
   .Cast<XPathNavigator>()
   .ToDictionary(
      r => r.SelectSingleNode("td[1]").ValueAsInt,
      r => r.SelectSingleNode("td[2]").ValueAsInt
   );
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]);