如何动态地将XElements添加到XML文件?

问题描述:

好的,所以我的程序将在运行时保存用户从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? –

您可以将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

非常感谢。我试过这个,意识到我错误地命名了一些东西,但设法让它起作用。非常感谢 –

你可以使用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 => 部分。错误消息读取: 最好的重载方法匹配有一些无效参数。 –