2016-04-26 12 views
0

OK, also speichert mein Programm eine beliebige Anzahl von XElements, die der Benutzer während der Laufzeit von einem NumericUpDown-Steuerelement erhält. Die Art, wie ich schrieb dies mit XmlTextWriter ist wie folgt:Wie kann ich XElements dynamisch zu einer XML-Datei hinzufügen?

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

aber auf diese Weise erlaubt mir nicht, die XML-Datei anhängen, damit ich es so versucht, zu schreiben:

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

    } 

und dies doesn‘ Lassen Sie mich eine for-Schleife innerhalb der neuen XElement-Deklaration verwenden (was verständlich ist), also brauche ich einen Weg darum, weil ich absolut ratlos bin. Die angezeigte Fehlermeldung besagt "ungültiger Ausdruck" für "", denn offensichtlich mag C# nicht, dass Sie eine for-Schleife in einem XElement starten. Irgendwelche Ideen, wie ich das umgehen kann?

+0

Können Sie uns zeigen, wie 'Xml' Struktur aussieht? auch ein erwartetes Xml? –

Antwort

0

Sie können die for-Schleife in eine neue Methode einfügen, die ein XElement [] zurückgibt, und die Methode aufrufen, in der die untergeordneten Elemente benötigt werden. Etwas wie folgt aus:

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

Wenn es einige kontextuelle Informationen, können Sie es in die neue Methode als Parameter übergeben. Ich hoffe ich konnte helfen.

+0

vielen dank. Ich versuchte es, erkannte, dass ich ein paar Dinge falsch benannt hatte, schaffte es aber, es zum Laufen zu bringen. Sehr geschätzt –

0

Sie könnten Enumerable.Range Erweiterung verwenden, die Ihnen ermöglichen sollte, verschachtelte Elemente innerhalb XElement zu konstruieren.

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

hallo, versucht hat, diese Idee und C# zu verwenden, nicht wie den. neuen XElement ("Assessments", Enumerable.Range (0, numericUpDownNoOfAssessments.Value) .Select (i => Teil der Fehlermeldung liest : Die beste überladene Methodenübereinstimmung hat einige ungültige Argumente. –