2016-04-26 34 views
0

好的,所以我的程序將在運行時保存用戶從NumericUpDown控件給出的任何數量的XElements。我的XmlTextWriter寫這個的方法如下:如何動態地將XElements添加到XML文件?

public void XMLWriteNewL4Module() 
    { 
     int i; 
     String workingDir = Directory.GetCurrentDirectory(); 
     //create a new file in the working directory 
     XmlTextWriter textWriter = new XmlTextWriter("Level4Modules.xml", null); 
     //opens the document 
     textWriter.WriteStartDocument();          //Document Start 
     //first student 
     textWriter.WriteStartElement("Module");        //Module start 
     //Module title element 
     textWriter.WriteStartElement("Title", "");        //Title start 
     textWriter.WriteString(this.textBoxModuleTitle.Text); 
     textWriter.WriteEndElement();            //Title end 
     //Module code element 
     textWriter.WriteStartElement("Code", "");         //Code start 
     textWriter.WriteString(this.textBoxModuleCode.Text); 
     textWriter.WriteEndElement();            //Code end 
     //Credit value element 
     textWriter.WriteStartElement("Credit Value", "");       //Credit value start 
     textWriter.WriteString(this.textBoxModuleCreditValue.Text); 
     textWriter.WriteEndElement();            //Credit value end 
     //Assessments element 
     textWriter.WriteStartElement("Assessments", "");       //Assessments start 
     for (i = 0; i < numericUpDownNoOfAssessments.Value; i++) 
     { 
      textWriter.WriteStartElement("Assessment", "");        //Assessment start 
      textWriter.WriteStartElement("Assessment Type", "");      //Assessment type start 
      textWriter.WriteString((comboBoxAssessments[i] as ComboBox).Text); 
      textWriter.WriteEndElement();            //Assessment type end 
      textWriter.WriteStartElement("Assessment Grade", "");      //Assessment grade start 
      textWriter.WriteString((textBoxAssessments[i] as TextBox).Text); 
      textWriter.WriteEndElement();            //Assessment grade end 
      textWriter.WriteStartElement("Assessment Weighting", "");     //Assessment weighting start 
      textWriter.WriteString((assessmentWeightingTextBox[i] as TextBox).Text); 
      textWriter.WriteEndElement();            //Assessment weighting end 
      textWriter.WriteEndElement();            //Assessment end 
     } 
     textWriter.WriteEndElement();            //Assessments end 
     textWriter.WriteEndElement();           //Module end 
     //end the document 
     textWriter.WriteEndDocument();          //Document end 
     //close the writer 
     textWriter.Close(); 
     Console.ReadLine(); 
    } 

,但這種方式並不讓我追加的XML文件,所以我想是這樣寫的:

public void XMLWriteNewL4Module() 
    { 
     String workingDir = Directory.GetCurrentDirectory(); 
     int i; 
     if (File.Exists(workingDir + @"Level4Modules.xml") == false) 
     { 
      //create a new file in the working directory 
      XmlTextWriter textWriter = new XmlTextWriter("Level4Modules.xml", null); 
      textWriter.WriteStartElement("Modules"); 
      textWriter.WriteEndElement(); 
      textWriter.Close(); 
     } 


     XElement xDoc = XElement.Load(workingDir + @"Level4Modules.xml"); 
     xDoc.Add(
     new XElement("Module", 
      new XElement("Title", this.textBoxStudentFirstName.Text), 
      new XElement("Code", this.textBoxStudentSurname.Text), 
      new XElement("Credit Value", this.textBoxStudentIDNewUser.Text), 
      new XElement("Assessments", 
      for (i = 0; i < numericUpDownNoOfAssessments.Value; i++) 
      { 
       new XElement("Assessment Type", (comboBoxAssessments[i] as ComboBox).Text), 
       new XElement("Assessment Grade",), 
       new XElement("Assessment Weighting",)) 
      } 
     )); 
     xDoc.Save(workingDir + @"\Students.xml"); 

    } 

和這並未」讓我在新的XElement聲明中使用for循環(這是可以理解的),所以我需要一種解決方法,因爲我絕對難住。它顯示的錯誤消息是「無效的表達式」,因爲顯然c#不喜歡你在XElement中啓動for循環。 任何想法如何解決這個問題?

+0

你能告訴我們什麼是'Xml'結構看起來像什麼?也是一個預期的Xml? –

回答

0

您可以將for循環放入一個新方法,該方法返回XElement [],並調用需要子項的方法。 事情是這樣的:

C#

new XElement("Module", 
      new XElement("Title", this.textBoxStudentFirstName.Text), 
      new XElement("Code", this.textBoxStudentSurname.Text), 
      new XElement("Credit Value", this.textBoxStudentIDNewUser.Text), 
      new XElement("Assessments", GetAssessments())); //the returned items will be added as child items to the "Assessments" node 

C#

XElement[] GetAssessments() 
{ 
    var result = new List<XElement>(); 
    for (int i = 0; i < numericUpDownNoOfAssessments.Value; i++) 
    { 
     result.Add(new XElement("Assessment Type", (comboBoxAssessments[i] as ComboBox).Text)); 
     result.Add(new XElement("Assessment Grade", "")); 
     result.Add(new XElement("Assessment Weighting", "")); 
    } 
    return result.ToArray(); 
} 

如果有一些相關的背景信息,您可以通過它進入新的方法作爲參數。 我希望我能幫上忙。

+0

非常感謝。我試過這個,意識到我錯誤地命名了一些東西,但設法讓它起作用。非常感謝 –

0

你可以使用Enumerable.Range擴展名,它應該允許你在XElement裏構造嵌套元素。

public void XMLWriteNewL4Module() 
{ 

    String workingDir = Directory.GetCurrentDirectory(); 
    int i; 
    if (File.Exists(workingDir + @"Level4Modules.xml") == false) 
    { 
     //create a new file in the working directory 
     XmlTextWriter textWriter = new XmlTextWriter("Level4Modules.xml", null); 
     textWriter.WriteStartElement("Modules"); 
     textWriter.WriteEndElement(); 
     textWriter.Close(); 
    } 


    XElement xDoc = XElement.Load(workingDir + @"Level4Modules.xml"); 
    xDoc.Add(
    new XElement("Module", 
     new XElement("Title", this.textBoxStudentFirstName.Text), 
     new XElement("Code", this.textBoxStudentSurname.Text), 
     new XElement("Credit Value", this.textBoxStudentIDNewUser.Text), 
     new XElement("Assessments", Enumerable.Range(0,numericUpDownNoOfAssessments.Value) 
        .Select(i=> 
        { 
         return new XElement[] { 
          new XElement("Assessment Type", (comboBoxAssessments[i] as ComboBox).Text), 
          new XElement("Assessment Grade"), 
          new XElement("Assessment Weighting") 
         }; 

        })))); 

    xDoc.Save(workingDir + @"\Students.xml"); 
} 
+0

嗨,試圖用這個想法和C#不喜歡: 新的XElement(「評估」,Enumerable.Range(0,numericUpDownNoOfAssessments.Value) 。選擇(i => 部分。錯誤消息讀取: 最好的重載方法匹配有一些無效參數。 –

相關問題