C# 使用C比较XML中的值#

C# 使用C比较XML中的值#,c#,linq-to-xml,nullreferenceexception,C#,Linq To Xml,Nullreferenceexception,我试图让我的代码说“如果模块中没有组件4,则不显示任何内容”。我从一个XML文件中读取值,该文件给出了模块的详细信息(名称、学分、评估等),并使用LINQ查询命令写出这些值 一切都很好,但我遇到了一个关于我想要设置的要求的问题。基本上,每个模块都有不同数量的评估,有些有2、3或4次。当我需要显示总共有4个评估的模块的详细信息时,代码运行良好,但是当有2个或3个评估时,我在这一行得到一个nullreferenceexception: var assessmentFour = from d in d

我试图让我的代码说“如果模块中没有组件4,则不显示任何内容”。我从一个XML文件中读取值,该文件给出了模块的详细信息(名称、学分、评估等),并使用LINQ查询命令写出这些值

一切都很好,但我遇到了一个关于我想要设置的要求的问题。基本上,每个模块都有不同数量的评估,有些有2、3或4次。当我需要显示总共有4个评估的模块的详细信息时,代码运行良好,但是当有2个或3个评估时,我在这一行得到一个nullreferenceexception:

var assessmentFour = from d in document.Descendants("moduleTitle")
                                 where d.Value == (String)comboBoxTab4Mod1.SelectedItem
                                 select d.Parent.Element("assessmentFour").Value; //exception thrown here
我知道为什么会抛出它,因为我在组合框中选择的模块没有assessmentFour值,所以我尝试使用以下方法解决它:

foreach (var item in assessmentFour)
        {
            if (assessmentFour != null)
            {
                labelTab4Mod1Cmpt4.Text = "";
            }
            else
            {
                labelTab4Mod1Cmpt4.Text = item.ToString();
            }
        }
但它不起作用。我不知道如何避免空引用异常,如果有人能为我指出,我将不胜感激

以下是XML文件(如果需要了解):

<?xml version="1.0" encoding="utf-8" ?>
<SoftwareEngineering>
  <Module>
    <moduleCode>ECSE401</moduleCode>
    <moduleTitle>Programming Methodology</moduleTitle>
    <credits>15</credits>
    <assessmentOne>Coursework</assessmentOne>
    <assessmentOneWeight>40</assessmentOneWeight>
    <assessmentTwo>Coursework</assessmentTwo>
    <assessmentTwoWeight>40</assessmentTwoWeight>
    <assessmentThree>Test</assessmentThree>
    <assessmentThreeWeight>20</assessmentThreeWeight>
  </Module>
  <Module>
    <moduleCode>ECSC404</moduleCode>
    <moduleTitle>Computer Systems Fundamentals</moduleTitle>
    <credits>15</credits>
    <assessmentOne>Test1</assessmentOne>
    <assessmentOneWeight>30</assessmentOneWeight>
    <assessmentTwo>Test2</assessmentTwo>
    <assessmentTwoWeight>30</assessmentTwoWeight>
    <assessmentThree>Test3</assessmentThree>
    <assessmentThreeWeight>40</assessmentThreeWeight>
  </Module>
  <Module>
    <moduleCode>EBSY401</moduleCode>
    <moduleTitle>Information and Data Modelling</moduleTitle>
    <credits>15</credits>
    <assessmentOne>Test</assessmentOne>
    <assessmentOneWeight>25</assessmentOneWeight>
    <assessmentTwo>Coursework1</assessmentTwo>
    <assessmentTwoWeight>10</assessmentTwoWeight>
    <assessmentThree>Coursework2</assessmentThree>
    <assessmentThreeWeight>35</assessmentThreeWeight>
    <assessmentFour>Coursework3</assessmentFour>
    <assessmentFourWeight>30</assessmentFourWeight> 
  </Module>
  <Module>
    <moduleCode>ECSC405</moduleCode>
    <moduleTitle>Software Development Principles</moduleTitle>
    <credits>15</credits>
    <assessmentOne>Test1</assessmentOne>
    <assessmentOneWeight>30</assessmentOneWeight>
    <assessmentTwo>Coursework</assessmentTwo>
    <assessmentTwoWeight>40</assessmentTwoWeight>
    <assessmentThree>Test2</assessmentThree>
    <assessmentThreeWeight>30</assessmentThreeWeight>
  </Module>
  <Module>
    <moduleCode>ECSC407</moduleCode>
    <moduleTitle>Web Technology</moduleTitle>
    <credits>15</credits>
    <assessmentOne>Tutorials</assessmentOne>
    <assessmentOneWeight>20</assessmentOneWeight>
    <assessmentTwo>Coursework</assessmentTwo>
    <assessmentTwoWeight>20</assessmentTwoWeight>
    <assessmentThree>Exam</assessmentThree>
    <assessmentThreeWeight>60</assessmentThreeWeight>
  </Module>
  <Module>
    <moduleCode>ECSC409</moduleCode>
    <moduleTitle>Software Engineering Principles</moduleTitle>
    <credits>15</credits>
    <assessmentOne>Coursework1</assessmentOne>
    <assessmentOneWeight>40</assessmentOneWeight>
    <assessmentTwo>Coursework2</assessmentTwo>
    <assessmentTwoWeight>30</assessmentTwoWeight>
    <assessmentThree>Coursework3</assessmentThree>
    <assessmentThreeWeight>30</assessmentThreeWeight>
  </Module>
  <Module>
    <moduleCode>ECSC408</moduleCode>
    <moduleTitle>Mathematics for Computing</moduleTitle>
    <credits>15</credits>
    <assessmentOne>Coursework</assessmentOne>
    <assessmentOneWeight>50</assessmentOneWeight>
    <assessmentTwo>Exam</assessmentTwo>
    <assessmentTwoWeight>50</assessmentTwoWeight>
  </Module>
  <Module>
    <moduleCode>EBSY400</moduleCode>
    <moduleTitle>Communication and Learning Skills</moduleTitle>
    <credits>15</credits>
    <assessmentOne>Coursework</assessmentOne>
    <assessmentOneWeight>30</assessmentOneWeight>
    <assessmentTwo>Coursework</assessmentTwo>
    <assessmentTwoWeight>70</assessmentTwoWeight>
  </Module>
</SoftwareEngineering>

ECSE401
编程方法
15
作业
40
作业
40
试验
20
ECSC404
计算机系统基础
15
测试1
30
测试2
30
测试3
40
EBSY401
信息和数据建模
15
试验
25
课程作业1
10
课程作业2
35
课程作业3
30
ECSC405
软件开发原则
15
测试1
30
作业
40
测试2
30
ECSC407
网络技术
15
教程
20
作业
20
考试
60
ECSC409
软件工程原理
15
课程作业1
40
课程作业2
30
课程作业3
30
ECSC408
计算数学
15
作业
50
考试
50
EBSY400
沟通和学习技能
15
作业
30
作业
70
请注意,每个模块的评估次数并不相同,这就是我得到错误的原因。我知道我可能会在每个模块中添加一个assessmentFour元素,然后这样做,但这真的很便宜。如果有人能帮我,我会很感激的。谢谢你

你可以试试这个

from d in document.Descendants("moduleTitle")
where d.Value == (String)comboBoxTab4Mod1.SelectedItem
select CheckNullElement(d.Parent.Element("assessmentFour"))
然后在类中进一步定义此函数

private string CheckNullElement(XElement x)
{
  if (x == null) return string.Empty;

  return x.Value;
}

以下是另一种似乎对我有效的方法:

        var assessmentFour = from d in doc.Descendants("Module")
                             where (string)d.Element("moduleTitle") == (String)comboBoxTab4Mod1.SelectedItem
                                         let el = d.Elements("assessmentFour").FirstOrDefault()
                                         select (el == null ? String.Empty : (string)el);

CheckNullElement在当前上下文中不存在。你导入了什么东西吗?这是一个用户定义的函数-代码就在我的回答中。哦,我只是先做了一个小动作,然后一点一点地进行。谢谢,这很有效,而且是一种非常有效的方法。道具