2012-04-15 79 views
1

我試圖從我的XML元素中獲取值並將其轉換爲使用linq命令的整數,因此我可以使用它來執行一些數學公式。如何使用linq-c將XML元素值轉換爲int#

這是我到目前爲止已經試過:

private void buttonTab4Mod1Calculate_Click(object sender, EventArgs e) 
     { 
      var document = XDocument.Load(workingDir + @"\Level4.xml"); 

      var assessmentOneWeight = from d in document.Descendants("moduleTitle") 
             where d.Value == (String)comboBoxTab4Mod8.SelectedItem 
             select d.Parent.Element("assessmentOneWeight").Value; 
      int a = 0; 
      foreach (var item in assessmentOneWeight) 
      { 
       a = Convert.ToInt32(item); 
      } 
      MessageBox.Show(a.ToString()); 
     } 

但價值仍是0出於某種原因。

這是我的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> 

將不勝感激一些幫助。

+0

你確定'assessmentOneWeight'正在返回一些東西嗎?您的消息框位於主循環之外,我們無法確定是否有任何結果可以返回。 – yamen 2012-04-15 22:00:20

+2

你是否試圖用你自己的作品做作業/作業?我記得至少有3個問題具有相同的xml – 2012-04-15 22:00:22

+0

同樣在你過去的問題中。對於前,http://stackoverflow.com/questions/9954060/how-to-match-elements-in-xml-c-sharp – 2012-04-15 22:06:37

回答

3

只是cast the XElement to int

private void buttonTab4Mod1Calculate_Click(object sender, EventArgs e) 
{ 
    var document = XDocument.Load(workingDir + @"\Level4.xml"); 

    string selectedItem = (string) comboBoxTab4Mod8.SelectedItem; 
    var assessmentOneWeight = from d in document.Descendants("moduleTitle") 
           where (string) d == selectedItem 
           select (int) d.Parent.Element("assessmentOneWeight"); 
    foreach (int item in assessmentOneWeight) 
    { 
     MessageBox.Show(item.ToString()); 
    }   
} 

注意,當參考確實XElement,但如果你投一個空引用int?你得到一個空值回你也可以cast to int?它的工作方式相同 - 如果您不知道是否爲對應的元素,這可能會有所幫助。

XElementXAttribute也有很多明確的轉換 - 它們讓生活變得更容易。

+0

感謝Jon,所以現在我已經知道了值我將在foreach循環外部和foreach循環內部聲明一個int變量使變量的值等於item,這樣我就可以執行我的數學方程。 – a7omiton 2012-04-16 10:57:17

+0

@ AZ1:這對我來說沒什麼意義 - 它是每個元素的一個值*(在這種情況下在循環中聲明它)還是根據元素的值*修改的一個值*(例如,創建一個總計)?如果你只是把它設置爲項目的價值,那麼你就有效地說「我只關心最後一個元素」。 – 2012-04-16 10:59:24

+0

我想要做的是得到這個元素的價值,用戶會選擇,因爲我不知道他們會選擇哪一個我需要在foreach循環中聲明它。我將使用該值(這是評估重量的百分比權重爲總模塊等級),並將其除以100,然後乘以用戶在文本框中輸入的另一個值(表明他們期望得到什麼等級) 。 – a7omiton 2012-04-16 18:45:35

1

我敢肯定,您的assessmentOneWeight集合不包含單個值,因爲在XML中找不到comboBoxTab4Mod8.SelectedItem的值。

因此,您總是得到0,因爲a使用0進行初始化。


順便說一句:我強烈建議你改進你的代碼。

遍歷<Module>元素而不是<moduleTitle>元素。這使得更多的意義,因爲你需要這個元素(即<assessmentOneWeight>

科協<assessmentOneWeight值的數據>直接在LINQ的語句,像這樣:

var assessmentOneWeight = 
    from d in document.Descendants("moduleTitle") 
    where d.Value == (String)comboBoxTab4Mod8.SelectedItem 
    select int.Parse(d.Parent.Element("assessmentOneWeight").Value); 

foreach沒有很好地設計,因爲它僅取得集合中找到的最後一個值。如果你真的想要使用LINQ的強大功能並只選擇那個值。

+0

我之所以使用''的原因是因爲我認爲我需要與組合框中的選定項目進行比較,我不知道您可以選擇父''並將其與組合框值進行比較以及 – a7omiton 2012-04-16 10:40:21

相關問題