Надеясь, что кто-то может указать мне в правильном направлении.
Я пытаюсь выполнить итерацию через 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());
}
}
}
Что мне нужно, чтобы получить первую строку и последнюю строку этой таблицы?
Лично мне нравится Linq для 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 для наборов данных
Я бы использовал класс XElement
вместо DataSets. Тогда вы можете прочитать свой файл даже с помощью этого:
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 } });
Конечно, я не проверял это, но вы можете понять суть. У него также нет обработки ошибок, и это может быть более эффективным, но опять же вы можете увидеть суть работы.