Итерация по набору данных для получения дочерних строк

1

Надеясь, что кто-то может указать мне в правильном направлении.

Я пытаюсь выполнить итерацию через 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
    Вы пробовали DataRow.GetChildRows ?
  • 0
    Есть ли причина, по которой вы используете набор данных, а не просто разбираете XML? Кажется, что это будет более простой способ поддерживать.
Показать ещё 5 комментариев
Теги:
dataset

2 ответа

2
Лучший ответ

Лично мне нравится 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);
}

Если по какой-то причине вам действительно нужно использовать наборы данных, вам нужно будет сделать следующее

  1. Не петля над коллекцией DataTable, а просто используйте таблицу элементов
  2. Используйте GetChildRows, используя DataRelation "item_needthis". Вы можете найти имя отношения данных, проверив коллекцию DataSet.Relations


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 для наборов данных

  • 0
    Отлично спасибо.
  • 0
    @ Бовенак без проблем. Я также добавил ответ на заданный вами вопрос на тот случай, если кто-то еще сталкивается с этим вопросом и ему необходимо использовать наборы данных.
1

Я бы использовал класс 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 } });

Конечно, я не проверял это, но вы можете понять суть. У него также нет обработки ошибок, и это может быть более эффективным, но опять же вы можете увидеть суть работы.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню