Adatok írása xml-be. Könnyen írhat és olvashat XML-t az XmlSerializer segítségével

27.10.2019 Vélemények

- jól ismert weboldalak, amelyek szintén az XML analógjai, gyenge ellenőrzésekkel.

Az XML Reader/Writer Objects, FastInfoset, HTML kiterjeszti a szöveges fájlok olvasási képességeit a jelölőcímkék beépített feldolgozásával.

DOMBuilder/DOMRecord objektumokhoz (lásd alább) adatforrásként is használatosak.

Az XML 1C fájlok tartalmazzák szöveges információk, vagyis azok szöveges fájlok. Az 1C XML Reader és 1C Write XML objektumok egy „bővítmény”, amely megkönnyíti az XML címkékkel való munkát az 1C fájlokban.

A ReadingFastInfoset 1C és WritingFastInfoset 1C, ReadingHTML 1C és WritingHTML 1C objektumok teljesen hasonlóak a ReadingXML 1C és WritingXML 1C objektumokhoz, és más formátumokkal is ugyanúgy működnek.

A példákban használt XML 1C fájl

Címtár>

Címtár>

Szöveges értékProps>
Címtár>
Konfiguráció>

1. példa: Olvasás XML fájl 1C az értékfába az XML Reading 1C használatával

//nyissa meg az XML 1C fájlt olvasáshoz a ReadingXML 1C használatával
Fájl = Új ReadXML();
File.OpenFile("D:\ConfigurationStructure.xml");

//elkészítjük az értékfát
//minden XML ágnak lehet neve, attribútumai és értékei
dzXML = NewValueTree();
dzXML.Columns.Add("Név");
dzXML.Columns.Add("Érték");
dzXML.Columns.Add("Attribútumok");

//mivel egy XML karakterláncnak több attribútuma is lehet, ezeket beírjuk az értéktáblázatba
//minden attribútumnak van neve és értéke
tAttribútumok = Új értéktábla();
tAttributes.Columns.Add("Név");
tAttributes.Columns.Add("Érték");

//a beágyazási szint segít megértenünk, mikor kell beágyazott ágat hozzáadnunk, és mikor kell visszamennünk egy szinttel
Beágyazási szint = 0;
//Az aktuális sor egy fasor, a fészkelés növekedésével változik
CurrentRow = Undefined;
//az XML 1C fájl beolvasása nem soronként, hanem a struktúra szerint történik; amikor a fájl véget ér, az olvasás FALSE értéket ad vissza
Míg File.Read() Loop

//háromféle csomópontra vagyunk kíváncsiak - az elem eleje, a szöveg (az elem értéke) és az elem vége (a legfelső szintre való visszatéréshez)
Ha File.NodeType = XMLNodeType.ElementStart Akkor

Beágyazási szint = Beágyazási szint + 1;

//ha ez az első sor, akkor adja hozzá a fa legtetejéhez, és csak a nevet mentse el
Ha CurrentRow = Undefined Akkor
CurrentRow = dXML.Rows.Add();
CurrentLine.Name = Fájlnév;
Folytatni;
Másképp
//beágyazott sorok
CurrentRow = AktuálisSor.Sorok.Hozzáadás();
CurrentLine.Name = Fájlnév; //mentse el a nevet

//van ennek az XML elemnek attribútumai?
Ha File.NumberAttributes() > 0 Akkor
//ha igen, másolja át az előkészített üres táblát az attribútumok mentéséhez
tAttributesNode = tAttributes.Copy();
//ciklusos az elem attribútumai között
Fiók esetén = 0 a File.Number of Attributes()-1 ciklus szerint
//minden attribútumnál emlékezzen a névre és az értékre
Row = tNodeAttributes.Add();
Line.Name = File.AttributeName(Sch);
Sor.Érték = File.AttributeValue(Ac);
EndCycle;
//mentse az elem attribútumtáblázatát aktuális vonal
CurrentRow.Attributes = tNodeAttributes;
endIf;
endIf;

ElseIf File.NodeType = XMLNodeType.EndElement Akkor
//az elem elején növeljük a beágyazási szintet, az elem végén csökkentjük
Beágyazási szint = Beágyazási szint - 1;
//visszaadja az aktuális sort egy szinttel feljebb
CurrentRow = CurrentRow.Parent;

ElseIf File.NodeType = XMLNodeType.Text Akkor
//ha az elemnek van értéke, csak mentse el
CurrentRow.Value = File.Value;

endIf;

EndCycle;

File.Close();

2. példa 1C XML fájl rögzítése az 1C Record XML objektum használatával

//fájl létrehozása Record XML 1C
Fájl = NewWriteXML();
File.OpenFile("D:\ConfigurationStructure.xml", "UTF-8");
File.WriteElementStart("Konfiguráció");

//metaadatok használata az összes könyvtár bejárásához (további részletekért lásd: „A metaadatok kezelése”)
Minden könyvtárhoz a Metadata.Directories ciklusból

//WriteStartofElement - új [alárendelt] ágat nyit meg
File.WriteElementStart("Könyvtár");
//WriteAttribute - attribútumot ír egy korábban megnyitott ágba
File.WriteAttribute("Név", Directory.Name);
File.WriteAttribute("Synonym", Directory.Synonym);

//metaadatok segítségével végigmegyünk a könyvtár összes részletén
Minden Props a Directory.Props ciklusból




EndCycle;

//használjon metaadatokat a könyvtár összes táblázatos részének bejárásához
Minden egyes PM-hez a címtárból. A ciklus táblázatos részei
File.WriteElementStart("TabularPart");
File.WriteAttribute("Név", PM.Name);
File.WriteAttribute("Synonym", PM.Synonym);

Minden Props a PM.Props ciklusból
File.WriteElementStart("Props");
File.WriteAttribute("Név", Attributes.Name);
File.WriteAttribute("Synonym", Attributes.Synonym);
File.WriteEndElement();
EndCycle;

File.WriteEndElement();
EndCycle;

//WriteEndElement - „bezárja” a korábban a WriteBeginElement segítségével megnyitott ágat
File.WriteEndElement();
EndCycle;

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

Ebben a cikkben egy módszert szeretnék leírni az XML-fájlok írására és olvasására az XmlSerializer osztály használatával. Ez az osztály a System.Xml.dll összeállítás System.Xml.Serialization névterében található. Elég régen jelent meg – még a .NET első verzióiban. Ennek az osztálynak az objektuma két érdekes metódussal rendelkezik - Serialize és Deserialize. Ez a cikk arról szól, hogyan lehet szinte bármilyen szerkezetű XML-fájlt olvasni vagy írni, egyszerű osztályokkal leírva a C# nyelven. Annak megértéséhez, hogy ezeknek a módszereknek a használata nagyon kényelmes, adok egy példát egy osztályra:

Nyilvános osztályelem ( public int id; public string name; public List Values; public bool CurrentStatus; ) Ez az osztály könnyen konvertálható a következő XML-be:12.34 Elem_név> 56.78 Elem_név> Gyűjtemény_név> Gyökér_elem_neve> Ehhez elegendő két olyan metódust megvalósítani, amelyek a szerializációs (SaveXml) és a deszerializációs (LoadXml) metódusok törzsét foglalják magukba: public static bool SaveXml(stringingobjectname obj) (, result = false; using ( StreamWriter writer = new StreamWriter(fájlnév)) ( próbáld meg ( XmlSerializerNamespaces ns = new XmlSerializerNamespaces(); ns.Add("", ""); XmlSerializer serializer = new XmlSerializer(obj.GetType); serializer.Serialize(writer, obj, ns); result = true; ) catch (e kivétel ) ( objektum eredmény = null ; using (StreamReader olvasó = új StreamReader(fájlnév)) ( próbálja meg ( XmlSerializer serializer = new XmlSerializer(type); result = serializer.Deserialize(reader); ) catch (E kivétel) ( // Naplózás ) végül ( olvasó.Bezárás( ); ) ) eredményt ad vissza; ) Most egy teljes példát adok a fenti módszerek használatára: Item item = new Item(); item.id = 42; item.name = "Cikk neve"; item.values ​​= new List(); item.values.Add(12.34); item.values.Add(56.78); SaveXml(elem, "d:\\obj.xml"); Item obj = LoadXml(típus(elem), "d:\\obj.xml") mint elem; Most egy kicsit az XML szerializációs módszer rugalmasságáról. Az első kérdés az, hogyan lehet egy osztálytagot csomópont-attribútumként szerializálni. Ehhez csak csatolja hozzá az attribútumot. Ezt az attribútumot átnevezheti a következő paraméterrel: . Ha egy osztálytagot normál csomópontként kell mentenünk, akkor nem kell semmit írnunk. Bár, ha magát a csomópontot kell átnevezni, beilleszthetjük a . Az objektumgyűjtemények kapcsán meg kell jegyezni, hogy a gyűjtőcsomópontok átnevezése ugyanolyan egyszerű, mint a közönséges elemek átnevezése. Ehhez a és attribútumok a gyűjtemény elé kerülnek. Ezen attribútumok paramétereként megadhatja azoknak a csomópontoknak a nevét, amelyekben maga a gyűjtemény és annak elemei lesznek tárolva. Ha nem szeretnénk egy elemet XML-ben menteni, akkor megjelölhetjük a -val. A leírt módszer lehetővé teszi, hogy nagyon gyorsan „megtanítsa” a programot a különféle XML-ekkel való munkavégzésre. És ez nem mindenki számára szükséges XML formátumírjon külön kódot. Elegendő a formátumot deklaratívan leírni egy C# osztály formájában a szükséges attribútumokkal.