brobh ha scritto:
Dato che non funziona, mi chiedevo se a essere sbagliato è qualcosa che riguarda il modo in cui definisco il path del file, se dovrei specificare qual è la root anziché istanziare oggetti XmlNode o se sto proprio sbagliando approccio...
Nel tuo codice ci sono diversi problemi: innanzitutto,
crei gli attributi con i valori dell'oggetto Teacher, ma poi non li vai ad aggiungere all'elemento, quindi non li troverai all'interno del documento XML salvato. Inoltre, stai usando il valore dell'attributo nel costruttore come parametro errato (non si aspetta il valore!).
Ad esempio, dovresti fare in questo modo:
var attrId = xmlDoc.CreateAttribute("TeacherID");
attrId.Value = oggettoTeacher.Id.ToString();
newTeacher.Attributes.Append(attrId);
var attrName = xmlDoc.CreateAttribute("Name");
attrName.Value = oggettoTeacher.Name;
newTeacher.Attributes.Append(attrName);
var attrSurname = xmlDoc.CreateAttribute("Surname");
attrSurname.Value = oggettoTeacher.Surname;
newTeacher.Attributes.Append(attrSurname);
Inoltre, il percorso XPath che hai usato - "//teacher" - seleziona tutti i nodi di tipo
<teacher> ma (se non ricordo male) ti restituisce solo il primo, visto che hai chiamato
SelectSingleNode(), quindi
andresti a inserire un nuovo elemento dopo il primo e non dopo l'ultimo.
Non ti serve acquisire un riferimento all'elemento figlio, ti basta avere quello del padre e usare il metodo che consente di accodare un nuovo elemento in fondo ai figli già esistenti:
Teachers.AppendChild(newTeacher);
Il mio invito è quello di scrivere il codice ma consultando prima la documentazione delle classi che stai usando, e/o verificando che i valori specificati vadano a finire nelle proprietà e nei parametri giusti.
Un ulteriore consiglio è quello di
non usare XmlDocument, bensì la classe XDocument nel namespace
System.Xml.Linq, che offre un approccio più semplice, più moderno e anche più performante in determinati casi.
Ad esempio, nel tuo codice stai banalmente navigando nel documento XML tra un elemento e l'altro, ma
ricorri a XPath per ogni occasione: questo a mio avviso è sbagliato poiché il parser delle espressioni XPath impiega risorse e tempo per restituirti i risultati ed è fatica sprecata per le necessità di modifica del documento che hai. Usando la classe
XDocument, il tuo codice si potrebbe sintetizzare così:
const string nomeFile = @"File.xml";
var xmlDoc = XDocument.Load(nomeFile);
xmlDoc
.Element("School")
.Element("Teachers")
.Add(
new XElement("Teacher",
new XAttribute("TeacherID", oggettoTeacher.Id),
new XAttribute("Name", oggettoTeacher.Name),
new XAttribute("Surname", oggettoTeacher.Surname)
)
);
xmlDoc.Save(nomeFile);
Prendi un po' di tempo per
documentarti e studiare gli esempi.
Ciao!