希望有人能指出我正确的方向。
我正在尝试遍历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());
}
}
}
我需要什么才能获得该表的第一行和最后一行?
答案 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);
}
如果由于某种原因您确实需要使用数据集,则需要执行以下操作
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 } });
当然我没有对此进行过测试,但你可以看到这一点。它也没有任何错误处理,它可能更有效,但你再次可以看到它的工作原理。