Zapisivanje podataka u xml. Jednostavno pišite i čitajte XML koristeći XmlSerializer

27.10.2019 Recenzije

- dobro poznate web stranice, koje su također analogne XML-u sa slabim provjerama.

XML Reader/Writer Objects, FastInfoset, HTML proširuju mogućnosti čitanja tekstualne datoteke s ugrađenom obradom markup oznaka.

Također se koriste za objekte DOMBuilder/DOMRecord (vidi dolje) kao izvore podataka.

XML 1C datoteke sadrže tekstualne informacije, odnosno jesu tekstualne datoteke. Objekti 1C XML Reader i 1C Write XML su "dodatak" koji olakšava rad s XML oznakama u 1C datoteci.

Objekti ReadingFastInfoset 1C i WritingFastInfoset 1C, ReadingHTML 1C i WritingHTML 1C potpuno su slični ReadingXML 1C i WritingXML 1C i služe za rad na isti način s drugim formatima.

XML 1C datoteka korištena u primjerima

Imenik>

Imenik>

Tekstna vrijednostProps>
Imenik>
Konfiguracija>

Primjer 1: Čitanje XML datoteka 1C u stablo vrijednosti koristeći XML Reading 1C

//otvorite XML 1C datoteku za čitanje koristeći ReadingXML 1C
File = New ReadXML();
File.OpenFile("D:\ConfigurationStructure.xml");

//pripremite stablo vrijednosti
//svaka XML grana može imati ime, atribute i vrijednost
dzXML = NewValueTree();
dzXML.Columns.Add("Naziv");
dzXML.Columns.Add("Vrijednost");
dzXML.Columns.Add("Atributi");

//budući da XML niz može imati nekoliko atributa, zapisat ćemo ih u tablicu vrijednosti
//svaki atribut ima ime i vrijednost
tAtributi = Nova tablica vrijednosti();
tAttributes.Columns.Add("Naziv");
tAttributes.Columns.Add("Vrijednost");

//razina ugniježđivanja će nam pomoći da shvatimo kada trebamo dodati ugniježđenu granu, a kada se trebamo vratiti na višu razinu
Razina ugniježđenja = 0;
//trenutni redak je drvored, promijenit će se kako se gniježđenje povećava
CurrentRow = Nedefinirano;
//čitanje XML 1C datoteke ne vrši se redak po redak, već prema strukturi; kada datoteka završi, čitanje će vratiti FALSE
Dok File.Read() Petlja

//zanimaju nas tri vrste čvorova - početak elementa, tekst (vrijednost elementa) i kraj elementa (za povratak na gornju razinu)
Ako je File.NodeType = XMLNodeType.ElementStart Onda

Razina ugniježđenja = Razina ugniježđenja + 1;

//ako je ovo prvi red, dodajte ga na sam vrh stabla i spremite samo ime
If CurrentRow = Undefined Then
CurrentRow = dXML.Rows.Add();
CurrentLine.Name = File.Name;
Nastaviti;
Inače
//ugniježđene linije
CurrentRow = CurrentRow.Rows.Add();
CurrentLine.Name = File.Name; //spremite ime

//ima li ovaj XML element atribute?
Ako je File.NumberAttributes() > 0 Onda
//ako da, kopirajte pripremljenu praznu tablicu za spremanje atributa
tAttributesNode = tAttributes.Copy();
//kruži kroz broj atributa ovog elementa
Za Račun = 0 po Datoteci.Broj atributa()-1 ciklus
//za svaki atribut zapamtite ime i vrijednost
Redak = tNodeAttributes.Add();
Line.Name = File.AttributeName(Sch);
Redak.Vrijednost = Datoteka.VrijednostAtributa(Ac);
EndCycle;
//spremi tablicu atributa elementa u trenutna linija
CurrentRow.Attributes = tNodeAttributes;
završi ako;
završi ako;

ElseIf File.NodeType = XMLNodeType.EndElement Then
//na početku elementa povećavamo razinu ugniježđenja, na kraju elementa je smanjujemo
Razina ugniježđenja = Razina ugniježđenja - 1;
//vrati trenutnu liniju jednu razinu više
CurrentRow = CurrentRow.Parent;

ElseIf File.NodeType = XMLNodeType.Text Then
//ako element ima vrijednost, samo je spremite
CurrentRow.Value = File.Value;

završi ako;

EndCycle;

File.Close();

Primjer 2. Snimanje 1C XML datoteke pomoću 1C Record XML objekta

//stvori datoteku Zapis XML 1C
Datoteka = NewWriteXML();
File.OpenFile("D:\ConfigurationStructure.xml", "UTF-8");
File.WriteElementStart("Konfiguracija");

//koristi metapodatke za prolazak kroz sve direktorije (za više detalja pogledajte "Rad s metapodacima")
Za svaki direktorij iz ciklusa metapodataka.Direktoriji

//WriteStartofElement - otvara novu [podređenu] granu
File.WriteElementStart("Imenik");
//WriteAttribute - upisuje atribut u prethodno otvorenu granu
File.WriteAttribute("Naziv", Imenik.Naziv);
File.WriteAttribute("Sinonim", Imenik.Sinonim);

//pomoću metapodataka prolazimo kroz sve detalje imenika
Za svaki rekvizit iz imenika.ciklus rekvizita




EndCycle;

//koristi metapodatke za prolazak kroz sve tablične dijelove imenika
Za svaki PM iz Imenika.Tabelarni dijelovi ciklusa
File.WriteElementStart("TabularPart");
File.WriteAttribute("Ime", PM.Name);
File.WriteAttribute("Sinonim", PM.Sinonim);

Za svaki rekvizit iz PM.Props ciklusa
File.WriteElementStart("Props");
File.WriteAttribute("Ime", Attributes.Name);
File.WriteAttribute("Sinonim", Atributi.Sinonim);
File.WriteEndElement();
EndCycle;

File.WriteEndElement();
EndCycle;

//WriteEndElement - “zatvara” granu koja je prethodno otvorena korištenjem WriteBeginElement
File.WriteEndElement();
EndCycle;

File.WriteEndElement();
File.Close();

U ovom članku želim opisati metodu za pisanje i čitanje XML datoteka pomoću klase XmlSerializer. Ova se klasa nalazi u prostoru imena System.Xml.Serialization sklopa System.Xml.dll. Pojavio se dosta davno - još u prvim verzijama .NET-a. Objekt ove klase ima dvije zanimljive metode - Serialize i Deserialize. Ovaj članak govori o tome kako čitati ili pisati XML datoteku gotovo bilo koje strukture, opisujući je jednostavnim klasama u C#. Da bismo razumjeli da je korištenje ovih metoda vrlo zgodno, dat ću primjer klase:

Javna klasa Item ( public int id; public string name; public List values; public bool CurrentStatus; ) Ova se klasa može jednostavno pretvoriti u sljedeći XML:12.34 Element_Name> 56.78 Element_Name> Collection_Name> Root_Element_Name> Da biste to učinili, dovoljno je implementirati dvije metode koje enkapsuliraju tijelo metoda serijalizacije (SaveXml) i deserijalizacije (LoadXml): public static bool SaveXml(object obj, string filename) ( bool rezultat = false; koristeći ( StreamWriter writer = new StreamWriter(filename)) ( try ( XmlSerializerNamespaces ns = new XmlSerializerNamespaces(); ns.Add("", ""); XmlSerializer serializator = new XmlSerializer(obj.GetType()); serializator.Serialize(writer, obj, ns); result = true; ) catch (Exception e) ( // Logging ) finally ( writer.Close(); ) ) return result; ) public static object LoadXml(Type type, string filename ) ( object result = null ; using (StreamReader reader = new StreamReader(filename)) ( try ( XmlSerializer serializator = new XmlSerializer(type); result = serializer.Deserialize(reader); ) catch (Exception e) ( // Logging ) finally ( reader.Close( ); ) ) vrati rezultat; ) Sada ću dati potpuni primjer korištenja gornjih metoda: Item item = new Item(); item.id = 42; item.name = "Naziv stavke"; item.values ​​​​= novi popis(); item.values.Add(12.34); item.values.Add(56.78); SpremiXml(stavka, "d:\\obj.xml"); Stavka obj = LoadXml(typeof(Item), "d:\\obj.xml") kao stavka; Sada malo o fleksibilnosti ove XML metode serijalizacije. Prvo pitanje je kako serijalizirati člana klase kao atribut čvora. Da biste to učinili, samo mu priložite atribut. Ovaj atribut možete preimenovati pomoću parametra: . Ako trebamo spremiti člana klase kao obični čvor, tada ne moramo ništa pisati. Iako, ako trebamo preimenovati sam čvor, možemo umetnuti . Što se tiče kolekcija objekata, treba napomenuti da je preimenovanje čvorova zbirke jednako jednostavno kao i preimenovanje običnih elemenata. Da biste to učinili, atributi i umetnuti su prije zbirke. Kao parametar za ove atribute, možete proslijediti nazive čvorova u kojima će biti pohranjena sama zbirka i njeni elementi. Ako ne želimo spremiti element u XML, možemo ga označiti s . Opisana metoda omogućuje vam da vrlo brzo "naučite" program kako raditi s različitim XML-om. A to nije potrebno svima XML format napisati poseban kod. Dovoljno je deklarativno opisati format u obliku C# klase s potrebnim atributima.