Ciao,
secondo me potresti fare così :
Fai riferimento allo spazio dei nomi System.Xml.Serialization ;
Crei una nuova classe avente nome identico a quello dell'elemento radice contenuto nel file XML, nel tuo caso "contatto" (ricorda che c# è case sensitive);
In questa nuova classe aggiungi tante proprietà di tipo stringa quanti sono i figli dell'elemento <contatto>;
crei un costruttore che accetti come parametro il nome del file contenente l'xml;
crei un metodo salva.
Di seguito un esempio :
La classe contatto
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Xml.Serialization;
namespace Prove
{
public class Contatto
{
//campi privati
private XmlSerializer serializer;
private string NomeFileXml;
//proprietà
public string textbox1 { get; set; }
public string textbox2 { get; set; }
public string textbox3 { get; set; }
public string textbox4 { get; set; }
public string textbox5 { get; set; }
public string textbox6 { get; set; }
public string textbox7 { get; set; }
public string textbox8 { get; set; }
public string textbox9 { get; set; }
public string textbox10 { get; set; }
//costruttore vuoto
public Contatto()
{
}
//costruttore con parametro
public Contatto(string nf)
{
NomeFileXml = nf;
serializer = new XmlSerializer(typeof(Contatto));
using (StreamReader sr = new StreamReader(NomeFileXml))
{
Contatto cx = serializer.Deserialize(sr) as Contatto;
this.textbox1 = cx.textbox1;
this.textbox2 = cx.textbox2;
this.textbox3 = cx.textbox3;
this.textbox4 = cx.textbox4;
this.textbox5 = cx.textbox5;
this.textbox6 = cx.textbox6;
this.textbox7 = cx.textbox7;
this.textbox8 = cx.textbox8;
this.textbox9 = cx.textbox9;
this.textbox10 = cx.textbox10;
}
}
//metodo salva
public void Salva()
{
using (StreamWriter sw = new StreamWriter(NomeFileXml))
{
serializer.Serialize(sw, this);
}
}
}
}
Il codice di un Form che utilizza la classe Contatto
public partial class Form2 : Form
{
public Form2()
{
InitializeComponent();
}
private void Form2_Load(object sender, EventArgs e)
{
/*
anche se il file è di tipo txt l'importante è
che al suo interno contenga codice xml valido
*/
Contatto c1 = new Contatto("C2.txt");
c1.textbox5 = "Cane";
c1.Salva();
}
}
Se i tuoi file xml rispecchiano tutti lo stesso schema, ma anche se hanno un numero di elementi figlio minore delle proprietà della classe corrispondente Contatto, purchè abbiano nomi identici, possono essere gestiti col codice di esempio.
Se hai un file che contiene per esempio solo textbox3, textbox5, textbox6, come figli dell'elemento Contatto, lo puoi gestire col codice di esempio.
Se invece hai un file che contiene per esempio un elemento textbox11 non lo potrai modificare perché la classe Contatto non ha una proprietà textbox11.
All'inizio C2.txt conteneva questo testo :
<contatto>
<textbox1>Prova1</textbox1>
<textbox2>Prova2</textbox2>
<textbox3>Prova3</textbox3>
<textbox4></textbox4>
<textbox5>Prova5</textbox5>
<textbox6>Prova6</textbox6>
<textbox7></textbox7>
<textbox8></textbox8>
<textbox9>Prova9</textbox9>
<textbox10>Prova10</textbox10>
</contatto>
dopo la chiamata al metodo Salva se apri il file lo vedrai contenere questo testo :
<?xml version="1.0" encoding="utf-8"?>
<Contatto xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<textbox1>Prova1</textbox1>
<textbox2>Prova2</textbox2>
<textbox3>Prova3</textbox3>
<textbox4 />
<textbox5>Cane</textbox5>
<textbox6>Prova6</textbox6>
<textbox7 />
<textbox8 />
<textbox9>Prova9</textbox9>
<textbox10>Prova10</textbox10>
</Contatto>
Ciao.
Modificato da Mario Formosa il 01 novembre 2022 14:37 -