C#: salvează și recitește un catalog în XML
Folosește XML și LINQ to XML pentru un catalog C#. Salvează identificatori și titluri fără concatenări fragile și verifică datele reconstruite după citire.
În acest material
Persistarea nu este completă când fișierul a fost scris: trebuie să poți reconstrui aceleași informații. XML oferă o structură explicită, cu elemente și atribute, iar LINQ to XML se ocupă de escaparea caracterelor speciale. Nu construim manual text precum , deoarece un titlu cu ghilimele sau ampersand ar strica documentul.
Cum lucrezi cu exemplul
Programul complet folosește C# 7.3 și API-uri disponibile în .NET Framework 4.8. Deschide Lesson.csproj din arhivă sau creează un proiect Console App (.NET Framework 4.8) și înlocuiește Program.cs. Datele de demonstrație sunt incluse în cod.
Descarcă sursele și instrucțiunile.
Ideea și pașii de implementare
Documentul are rădăcina catalog, un atribut versiune și elemente carte cu atributul id. Titlul este conținut textual, nu cod. La citire verificăm rădăcina, versiunea, unicitatea ID-urilor și titlul nevid. Un XML bine format poate să nu respecte regulile aplicației; parsarea și validarea sunt etape separate.
Exemplul serializează în memorie, apoi parsează textul obținut. Pentru fișiere, XDocument.Save și XDocument.Load lucrează cu aceeași structură. Într-o aplicație care modifică date importante, scrie mai întâi într-un fișier temporar din același director, verifică-l, apoi înlocuiește versiunea veche cu o politică explicită de backup.
Exemplu și rezultat așteptat
Titlul Algoritmi & date este salvat cu escaparea necesară în XML. După recitire, utilizatorul trebuie să primească exact textul cu ampersand, nu secvența de escapare. Programul afișează 1: Algoritmi & date și verifică faptul că singura carte are ID 1. Nu depinde de ordinea atributelor sau de indentarea documentului.
Titlu: Algoritmi & date → XElement: text escapabil → XML serializat → Recitire: același titlu.Mărește schema ↗
Codul complet
using System;
using System.Collections.Generic;
using System.Linq;
using System.IO;
using System.Globalization;
using System.Xml.Linq;
using System.Data;
class Program {
static void Main() {
var doc=new XDocument(new XElement("catalog",new XAttribute("versiune",1),
new XElement("carte",new XAttribute("id",1),"Algoritmi & date")));
var loaded=XDocument.Parse(doc.ToString());
if (loaded.Root.Name!="catalog" || (int?)loaded.Root.Attribute("versiune")!=1)
throw new FormatException("Format necunoscut");
var ids=new HashSet<int>();
foreach(var book in loaded.Root.Elements("carte")) {
int id; string title=book.Value.Trim();
if (!int.TryParse((string)book.Attribute("id"),out id) || id<=0 || !ids.Add(id) || title.Length==0)
throw new FormatException("Carte invalida");
Console.WriteLine(id + ": " + title);
}
}
}
Rezultatul programului:
1: Algoritmi & date
Greșeli și limite
Nu compara fișierele XML numai ca șiruri dacă formatul vizual nu este relevant. Spațiile de indentare și ordinea atributelor pot diferi fără să schimbe datele. Pentru importul din surse necunoscute, impune limite de dimensiune și folosește un XmlReader configurat pentru a interzice DTD și rezolvarea resurselor externe. Nu executa fragmente din fișier ca instrucțiuni.
Exersează
Adaugă o a doua carte cu diacritice și verifică recitirea exactă. Încearcă o versiune necunoscută, un ID repetat și un titlu gol; toate trebuie refuzate. Salvează fișierul într-un director mutat și verifică pornirea din nou. Explică de ce testul „fișierul există” nu dovedește că ai păstrat corect titlurile.
Continuă parcursul
Parcursul complet de 50 de lecții
Lecția precedentă: C#: importă date numai după validarea întregului fișier
Lecția următoare: C#: testează modelul înainte de a desena interfața.
Referință: documentația Microsoft.
Întrebări frecvente
Trebuie să înlocuiesc manual ampersandul?
Nu când folosești XElement pentru valori text. Biblioteca produce escaparea XML necesară.
XML valid înseamnă catalog valid?
Nu. Trebuie verificate schema așteptată, identificatorii și regulile domeniului.
De ce includ o versiune?
Pentru a recunoaște formatul și a refuza sau migra explicit structuri incompatibile.
Un pas mai departe
Autentifică-te pentru a păstra progresul în cont.