У меня есть этот 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 ответ
Итак, в этом блоке кода:
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
};
Похожие вопросы
Новые вопросы
c#
C # (произносится как «резкий») - это высокоуровневый, статически типизированный язык программирования с несколькими парадигмами, разработанный Microsoft. Код C # обычно нацелен на семейство инструментов и сред выполнения Microsoft .NET, включая, среди прочего, .NET Framework, .NET Core и Xamarin. Используйте этот тег для вопросов о коде, написанном на C # или в формальной спецификации C #.