使用linq选择部分xml文档时出错

时间:2011-05-22 00:09:54

标签: .net linq-to-xml

嗨,这是我的xml文件。我想选择level4模块的modulecode,moduletiltle和credits,但是当我使用Descendants节点时,它会显示所有级别的所有后代节点。但我希望linq查询只选择level4模块信息

<myCourse>
  <courseName>BEng Mobile and Web Computing</courseName>
  <courseStructure>
    <level4>
      <module>
        <moduleCode>ECSC401</moduleCode>
        <moduleTitle>Programming Methodology</moduleTitle>
        <credits>15</credits>
        <semester>1</semester>
      </module>
      <module>
        <moduleCode>ECSC404</moduleCode>
        <moduleTitle>Computer Systems Fundamentals</moduleTitle>
        <credits>15</credits>
        <semester>1</semester>
      </module>
    </level4>
    <level5>
      <module>
        <moduleCode>ECSE501</moduleCode>
        <moduleTitle>Object Oriented Development</moduleTitle>
        <credits>30</credits>
        <semester>0</semester>
      </module>
      <module>
        <moduleCode>ECWM506</moduleCode>
        <moduleTitle>Mobile Computing Principles</moduleTitle>
        <credits>15</credits>
        <semester>1</semester>
      </module>
    </level5>
  </courseStructure>
</myCourse> 

我选择level4后代的代码:

var query = from r in xmlDoc.Element("level4").Descendants("module")
            select new
            {
                moduleCode=r.Element("moduleCode").Value,
                moduleTitle = r.Element("moduleTitle").Value,
                credits = r.Element("credits").Value
            };

1 个答案:

答案 0 :(得分:0)

您的代码应仅按预期抓取module的后代level4个节点。查询的一个问题是它应该遍历XML树而不是以level4的方式开始编写。换句话说,您的查询中应该引用courseStructure

试试这个:

var level4 = xdoc.Element("courseStructure")
                 .Element("level4");
var query = from r in level4.Descendants("module")
            select new
            {
                moduleCode = r.Element("moduleCode").Value,
                moduleTitle = r.Element("moduleTitle").Value,
                credits = r.Element("credits").Value
            };

当然你可以替换level4变量并将它们全部串在一起但是为了清楚起见我把它分开了。