从另一个xml文件中的另一个查询中获取基于数组的xml文件中的数据

时间:2014-04-06 11:43:20

标签: c# xml linq

我有这个表学生的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

1 个答案:

答案 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
    };