2012-04-15 4 views
0

Я пытаюсь сделать свой код «если в модуле нет компонента, ничего не отображается». Я читаю значения из файла XML, который дает детали модуля (имя, кредиты, оценки и т. Д.), И я пишу эти значения с помощью команд запроса LINQ.Сравнение значений в XML с использованием C#

Все работает нормально, но я столкнулся с проблемой относительно требования, которое я хочу установить. В принципе, каждый модуль имеет различное количество оценок, некоторые из них имеют 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 для модуля я выбрал в моей COMBOBOX, и поэтому я попытался решить, используя следующие:

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> 

уведомления, как каждый модуль не имеет одинаковое количество оценок, поэтому я получаю сообщение об ошибке. Я знаю, что я мог бы добавить элемент valuFour для каждого модуля и сделать это таким образом, но это действительно дешево. Если бы кто-нибудь мог мне помочь, я мог бы это оценить. Спасибо

ответ

1

Вы могли бы попробовать это ...

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; 
} 
+0

CheckNullElement не существует в текущем контексте. Вы что-то импортировали? – a7omiton

+0

это определенная пользователем функция - код находится прямо в моем ответе. – Jason

+0

О, я только что взял снипп сначала, все пошло немного. Спасибо, это работает, и это действительно эффективный способ сделать это. реквизит – a7omiton

0

Вот еще один подход, который, казалось, работал для меня:

 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);