我有这个表学生的xml文件,下面是结构。
<?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文件来获取所有模块(模块ID),其中Student_ID
是例如001.而我们使用结果进行第二次查询,它应该获取模块的所有模块名称ID是数组结果。
这就是我所拥有的,
// 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
获取模块名称和ID,它们与第一个xml文件返回的数组ID具有相同的ID。
// EDIT 目前它返回一个空的gridview,没有错误。我认为问题在于如何在第二个查询中调用第一个变量var
答案 0 :(得分: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
};