遍历数据集获取子行

时间:2014-07-21 15:30:30

标签: c# xml dataset

希望有人能指出我正确的方向。

我正在尝试遍历xml文件并获取每个"表"在xml文件中,并获取每个子行等。

我能够获得不是子行等的行。

以下是xml结构的示例。

<items>
    <item>
    <id>1</id>
    <row1>abc</row1>
    <row2>abc</row2>
    <needthis>
       <first>John</first>
       <last>John</last>
    </needthis>
    </item>
</items>

这就是我目前使用的。

 foreach (DataTable table in ds.Tables)
 {
   foreach (DataRow row in table.Rows)
   {
     foreach (DataColumn column in table.Columns)
     {
        object item = row["id"];
        object item2 = row["row1"];
        //Just to see what is returning
        System.Windows.Forms.MessageBox.Show(item.ToString());
        System.Windows.Forms.MessageBox.Show(item2.ToString());
      } 
    }
  }

我需要什么才能获得该表的第一行和最后一行?

2 个答案:

答案 0 :(得分:2)

我个人喜欢Linq to XML这样的事情。

//Probably want to use Load if you're using a file
XDocument xDoc = 
        XDocument.Parse (@" 
        <items>
            <item>
            <id>1</id>
            <row1>abc</row1>
            <row2>abc</row2>
            <needthis>
            <first>John</first>
            <last>John</last>
            </needthis>
            </item>
        </items>");

var items = from item in xDoc.Descendants("item") 
            from needThis in item.Descendants("needthis")
            select new 
            {       Id = item.Element("id").Value,
                    Row1 = item.Element("row1").Value,
                    first = needThis.Element("first").Value,
                    last = needThis.Element("last").Value
            };

foreach (var item in items)
{
     Console.WriteLine(item.Id);
     Console.WriteLine(item.Row1);
     Console.WriteLine(item.first);
     Console.WriteLine(item.last);
}

如果由于某种原因您确实需要使用数据集,则需要执行以下操作

  1. 不循环使用DataTable集合,只使用项目表
  2. 使用DataRelation“item_needthis”使用GetChildRows您可以通过检查DataSet.Relations Collection
  3. 找到数据关系名称。


    using(MemoryStream stream = new MemoryStream())
    {
            StreamWriter writer = new StreamWriter(stream);
            writer.Write(@" 
                <items>
                    <item>
                    <id>1</id>
                    <row1>abc</row1>
                    <row2>abc</row2>
                    <needthis>
                    <first>John</first>
                    <last>John</last>
                    </needthis>
                    </item>
                </items>");
            writer.Flush();
            stream.Position = 0;
    
        DataSet ds = new DataSet();
        ds.ReadXml(stream);
    
    
       DataTable table = ds.Tables["item"];
    
       foreach (DataRow row in table.Rows)
       {
            Console.WriteLine( row["id"] );
            Console.WriteLine( row["row1"] );
            var ChildRows = row.GetChildRows("item_needthis"); 
            foreach(var ntRow in ChildRows)
            {
                Console.WriteLine( ntRow["first"]);
                Console.WriteLine( ntRow["last"]);
            }
       }
    
    
    }
    

    您也可以使用Linq到数据集

答案 1 :(得分:1)

我会使用XElement类而不是DataSet。然后你就可以读到你的文件了:

XElement root = XElement.Load(...); // or Parse(...)

return root.Elements("item").Select(c => new { id = c.Element("id").Value,
                                               row1 = c.Element("row1").Value,
                                               row2 = c.Element("row2").Value,
                                               needthis = new { first = c.Element("needthis").Element("first").Value,
                                                                last = c.Element("needthis").Element("last").Value } });

当然我没有对此进行过测试,但你可以看到这一点。它也没有任何错误处理,它可能更有效,但你再次可以看到它的工作原理。