У меня есть этот xml-файл для таблицы student, и ниже представлена ​​структура.

<?xml version="1.0" encoding="utf-8"?>
 <StudentModules>
  <Student Student_ID="001">
    <Module  ID="M001" />
    <Module  ID="M002" />
    <Module  ID="M003" />
    <Module  ID="M004" />
  </Student>

  <Student Student_ID="002">
    <Module ID="M005"/>
    <Module ID="M006" />
    <Module ID="M007"/>
    <Module ID="M008" />
  </Student>

Затем у меня есть этот файл для модулей, а ниже - структура

<?xml version="1.0" encoding="utf-8"?>
 <ModuleSchedule>
  <ModuleTimeTable Module_ID="M001" ModuleName="Module Name 1">
    <Slot Day="Monday" Time="09:30"/>
    <Slot Day="Tuesday" Time="14:30"/>
    <Slot Day="Fridayday" Time="09:30"/>
    <Slot Day="Saturday" Time="12:30"/>
  </ModuleTimeTable>
 <ModuleTimeTable Module_ID="M002" ModuleName="Module Name 2">
    <Slot Day="Monday" Time="09:30"/>
    <Slot Day="Tuesday" Time="14:30"/>
    <Slot Day="Fridayday" Time="09:30"/>
    <Slot Day="Saturday" Time="12:30"/>
 </ModuleTimeTable>
 <ModuleTimeTable Module_ID="M003" ModuleName="Module Name 3">
    <Slot Day="Monday" Time="09:30"/>
    <Slot Day="Tuesday" Time="14:30"/>
    <Slot Day="Fridayday" Time="09:30"/>
    <Slot Day="Saturday" Time="12:30"/>    
 </ModuleTimeTable>

Я хочу использовать первый XML-файл, чтобы получить все модули (идентификатор модуля), где Student_ID, например, 001. И их я использую результаты для своего второго запроса, который должен получить все имена модулей, где идентификатор модуля - массив результат один.

Вот что у меня есть,

// first linq query

 XDocument stdoc = XDocument.Load(@"E:\studentModules.xml");

     var StudM = (from item in stdoc.Descendants("Student")
                 where item.Attribute("Student_ID").Value.Equals("001")
                 select item);

     foreach (XElement n in StudM)
      {

          var result = (from node in n.Descendants()
                      select new
                      {
                          Mod_ID = node.Attribute("ID").Value
                      });



       }

//second query (doesnt do the job)
 XDocument doc = XDocument.Load(@"E:\Module_Schedule.xml");
 var items = from item in doc.Descendants("ModuleTimeTable")
                where item.Attribute("Module_ID").Value.Contains("result")// doesnt     work
                    select new
                  {
                      ModuleId = (string)item.Attribute("Module_ID").Value,
                      ModuleName = (string)item.Attribute("ModuleName").Value

                   };


        GridView1.DataSource = items.ToList();
        GridView1.DataBind();

Как мне изменить это на работу. Я хочу получить имя модуля и идентификаторы из Module_Schedule.xml, которые имеют тот же идентификатор, что и идентификаторы массива, возвращенные из первого xml-файла.

// РЕДАКТИРОВАТЬ На данный момент он возвращает пустой вид сетки, без ошибок. Я думаю, проблема в том, как я могу вызвать первую переменную var result во втором запросе

1
Life_as_a_programmer 6 Апр 2014 в 15:43
Как это у вас сейчас не работает?
 – 
user456814
6 Апр 2014 в 15:48
На данный момент он возвращает пустую сетку, без ошибок. Я думаю, проблема в том, как я могу вызвать результат первой переменной var во втором запросе
 – 
Life_as_a_programmer
6 Апр 2014 в 15:51

1 ответ

Лучший ответ

Итак, в этом блоке кода:

foreach (XElement n in StudM)
{
    var result =
        from node in n.Descendants()
        select new { Mod_ID = node.Attribute("ID").Value };
}

Вы продолжаете присваивать результат, который не только определяется только внутри цикла foreach, но не вне его, но вы никогда не сохраняете и не делаете что-либо с переменной результата. Таким образом, они оба недоступны в области видимости вне цикла, а также перезаписываются после каждой итерации цикла.

Это должно работать:

var students = XDocument.Load(@"C:\Users\Keoki\Desktop\students.xml");
var modules = XDocument.Load(@"C:\Users\Keoki\Desktop\modules.xml");

var items =
    from s in students.Descendants("Student")
    where s.Attribute("Student_ID").Value == "001"
    select s.Descendants().Attributes("ID").Select(a => a.Value)
    into ids
    from m in modules.Descendants("ModuleTimeTable")
    where ids.Contains(m.Attribute("Module_ID").Value)
    select new {
       ModuleId = m.Attribute("Module_ID").Value,
       ModuleName = m.Attribute("ModuleName").Value
    };
1
6 Апр 2014 в 16:32
Это тоже не сработает, если я помещу второй запрос в цикл. Не могли бы вы предложить мне лучший способ, как я могу это изменить?
 – 
Life_as_a_programmer
6 Апр 2014 в 16:04
Не могли бы вы помочь мне с этим? "stackoverflow.com/questions/ 22912493 /… "
 – 
Life_as_a_programmer
7 Апр 2014 в 23:56