2016-04-26 5 views
0

в порядке, поэтому моя программа будет сохранять любое количество XElements, которые задаются пользователем из элемента управления NumericUpDown во время выполнения. То, как я написал это с 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"); 

    } 

и это Безразлично» t позвольте мне использовать цикл for внутри новой декларации XElement (что понятно), поэтому мне нужен способ, потому что я абсолютно тупик. Сообщение об ошибке, которое оно показывает, говорит «недопустимый термин выражения для», потому что, очевидно, C# не нравится, когда вы запускаете цикл for внутри XElement. Любые идеи, как я могу обойти это?

+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 => часть сообщения об ошибке : лучший перегруженный метод имеет несколько недопустимых аргументов. –