Xml-ը ֆայլում գրելը: Պարզ XML գրել և կարդալ XmlSerializer-ով

- հայտնի վեբ էջեր, որոնք նույնպես XML-ի անալոգն են ոչ խիստ ստուգումներով:

XML, FastInfoset, HTML կարդալու/գրելու օբյեկտները ընդլայնում են տեքստային ֆայլը կարդալու հնարավորությունները՝ նշագրման պիտակների ներկառուցված մշակմամբ:

Դրանք նաև օգտագործվում են DOM Builder/DOM' Writer օբյեկտների համար (տես ստորև) որպես տվյալների աղբյուրներ:

XML 1C ֆայլերը պարունակում են տեքստային տեղեկատվություն, այսինքն՝ նրանք են տեքստային ֆայլեր. XML Reader 1C և XML Writer 1C օբյեկտները «հավելում» են, որը հեշտացնում է XML ֆայլի 1C պիտակների հետ աշխատելը:

ReadFastInfoset 1C և WriteFastInfoset 1C, ReadHTML 1C և WriteHTML 1C օբյեկտները լիովին նման են ReadXML 1C-ին և WriteXML 1C-ին և աշխատում են նույն կերպ այլ ձևաչափերի հետ:

Օրինակներում օգտագործված XML 1C ֆայլը

տեղեկատու>

տեղեկատու>

Text valueProps>
տեղեկատու>
Կազմաձևում>

Օրինակ 1 Ընթերցանություն XML ֆայլ 1C արժեքների ծառին՝ օգտագործելով ReadingXML 1C

//բացեք XML 1C ֆայլը կարդալու համար՝ օգտագործելով ReadingXML 1C
Ֆայլ = Նոր XMLReader();
File.OpenFile ("D:\ConfigurationStructure.xml");

//պատրաստել արժեքի ծառը
//յուրաքանչյուր XML մասնաճյուղ կարող է ունենալ անուն, ատրիբուտներ և արժեք
dzXML = New ValueTree();
dzXML.Columns.Add(«Անուն»);
dzXML.Columns.Add("Value");
dzXML.Columns.Add(«Հատկանիշներ»);

//քանի որ XML տողը կարող է ունենալ մի քանի հատկանիշ, մենք դրանք կգրենք արժեքների աղյուսակում
//յուրաքանչյուր հատկանիշ ունի անուն և արժեք
tAttributes = NewValueTable();
հատկանիշ.Columns.Add("Name");
հատկանիշ.Columns.Add("Value");

// բնադրման մակարդակը կօգնի մեզ հասկանալ, թե երբ պետք է ավելացնենք բնադրված ճյուղ, և երբ պետք է վերադառնանք վերևի մակարդակին
NestingLevel = 0;
//Ընթացիկ գիծ - ծառի գիծ, ​​կփոխվի, քանի որ բույնը մեծանում է
CurrentRow = Չսահմանված;
//XML 1C ֆայլի ընթերցումը տող առ տող չի կատարվում, բայց ըստ կառուցվածքի, ֆայլի վերջում ընթերցումը կվերադարձնի FALSE:
Մինչդեռ File.Read() Loop

//մեզ հետաքրքրում են երեք տեսակի հանգույցներ՝ տարրի սկիզբը, տեքստը (տարրի արժեքը) և տարրի վերջը (մեկ մակարդակ վեր վերադարձնելու համար)
Եթե ​​File.NodeType = XMLNodeType.ElementStart Այնուհետեւ

NestingLevel = NestingLevel + 1;

//եթե սա առաջին տողն է, ապա ավելացրեք այն ծառի հենց վերևում և պահպանեք միայն անունը
Եթե ​​CurrentRow = Undefined Այնուհետեւ
CurrentRow = dzXML.Rows.Add();
CurrentLine.Name = File.Name;
Շարունակել;
Հակառակ դեպքում
// բնադրված գծեր
CurrentRow = CurrentRow.Rows.Add();
CurrentLine.Name = File.Name; //պահպանել անունը

// ունի այս տարրը XML ատրիբուտներ?
Եթե ​​File.NumberAttributes() > 0 Ապա
//եթե այո - պատճենեք պատրաստված դատարկ աղյուսակը՝ ատրիբուտները պահպանելու համար
tAttributesNode = tAttributes.Copy();
// շրջանցել այս տարրի ատրիբուտների քանակը
For Count = 0 ըստ File.NumberAttributes()-1 Loop-ի
//յուրաքանչյուր հատկանիշի համար հիշեք անունը և արժեքը
Տող = tNodeAttributes.Add();
String.Name = File.AttributeName(N);
String.Value = File.AttributeValue(Ac);
End Cycle;
// պահպանել տարրի հատկանիշի աղյուսակը ընթացիկ տողում
CurrentRow.Attributes = tAttributesNode;
Վերջ Եթե;
Վերջ Եթե;

ElseIf File.NodeType = XMLNodeType.EndElement Այնուհետեւ
// բարձրացնել բնադրման մակարդակը տարրի սկզբում, նվազեցնել բնադրման մակարդակը տարրի վերջում
NestingLevel = NestingLevel - 1;
//վերադարձրեք ընթացիկ գիծը մեկ մակարդակ վեր
CurrentRow = CurrentRow.Parent;

ElseIf File.NodeType = XMLNodeType.Text Այնուհետեւ
//եթե տարրն ունի արժեք, պարզապես պահպանիր այն
CurrentLine.Value = File.Value;

Վերջ Եթե;

End Cycle;

File.Close();

Օրինակ 2. 1C XML ֆայլ գրել WriteXML 1C օբյեկտի միջոցով

// ստեղծել WriteXML 1C ֆայլ
Ֆայլ = Նոր XMLWriter();
File.OpenFile ("D:\ConfigurationStructure.xml", "UTF-8");
File.WriteItemStart («Կազմաձևում»);

// ըստ մետատվյալների՝ մենք շրջանցում ենք բոլոր գրացուցակները (մանրամասների համար տե՛ս «Աշխատանք մետատվյալների հետ»)
Metadata.Catalogs Loop-ից յուրաքանչյուր գրացուցակի համար

//WriteItemStart - բացում է նոր [ենթակա] մասնաճյուղ
File.WriteItemStart («Տեղեկագիր»);
//WriteAttribute - գրում է հատկանիշը նախկինում բացված ճյուղում
File.WriteAttribute ("Name", Directory.Name);
File.WriteAttribute("Հոմանիշ", Directory.Synonym);

// մետատվյալներով մենք շրջանցում ենք գրացուցակի բոլոր մանրամասները
Handbook.Props Loop-ի յուրաքանչյուր հենակետի համար




End Cycle;

// մետատվյալներով մենք շրջանցում ենք գրացուցակի բոլոր աղյուսակային մասերը
Directory.TabularParts Loop-ից յուրաքանչյուր PM-ի համար
File.WriteItemBeginning ("TablePart");
File.WriteAttribute («Անուն», PT.Name);
File.WriteAttribute («Հոմանիշ», PM.Synonym);

PM.Props ցիկլի յուրաքանչյուր Props-ի համար
File.WriteItemBeginning ("Props");
File.WriteAttribute («Անուն», Props.Name);
File.WriteAttribute («Հոմանիշ», Props.Synonym);
File.WriteEndElement();
End Cycle;

File.WriteEndElement();
End Cycle;

//SaveItemEnd - «փակում» է նախկինում բացված մասնաճյուղը WriteItemStart-ի միջոցով
File.WriteEndElement();
End Cycle;

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

Այս հոդվածում ես ուզում եմ նկարագրել XML ֆայլեր գրելու և կարդալու մեթոդ XmlSerializer դասի միջոցով: Այս դասը System.Xml.Serialization անվանատարածքում է System.Xml.dll ժողովում: Այն հայտնվել է բավականին վաղուց՝ նույնիսկ .NET-ի առաջին տարբերակներում: Այս դասի օբյեկտն ունի երկու հետաքրքիր մեթոդ՝ Serialize և Deserialize: Այս հոդվածը այն մասին է, թե ինչպես կարելի է կարդալ կամ գրել XML ֆայլ գրեթե ցանկացած կառուցվածքի` այն նկարագրելով C#-ի պարզ դասերով: Հասկանալու համար, որ շատ հարմար է օգտագործել այս մեթոդները, ես դասի օրինակ կբերեմ.

Public class Item ( public int id; public string name; public List արժեքներ; public bool CurrentStatus; ) Այս դասը հեշտությամբ կարող է փոխարկվել հետևյալ XML-ի.12.34ElementName> 56.78ElementName>CollectionName>RootElementName> Դա անելու համար բավական է իրականացնել երկու մեթոդ, որոնք ներառում են սերիականացման (SaveXml) և ապասերիալիզացիայի (LoadXml) մեթոդների մի շարք. = կեղծ; օգտագործելով ( StreamWriter writer = նոր StreamWriter (ֆայլի անուն)) (փորձեք (XmlSerializerNamespaces ns = new XmlSerializerNamespaces(); ns.Add("", ""); XmlSerializer serializer = new XmlSerializer(obj.GetT); .Serialize(writer, obj, ns); արդյունք = true; ) catch (Exception e) ( // Logging) վերջապես ( writer.Close(); ) ) վերադարձնել արդյունքը; ) public static object LoadXml (Type type, string filename) (օբյեկտի արդյունք = null; օգտագործելով (StreamReader reader = նոր StreamReader (ֆայլի անուն)) (փորձեք (XmlSerializer serializer = նոր XmlSerializer(տեսակ); արդյունք = serializer.Deserialize(reader); ) catch (Exception e) ( // Logging) վերջապես ( reader.Close( ); ) ) վերադարձի արդյունքը ; ) Այժմ ես կտամ վերը նշված մեթոդների օգտագործման ամբողջական օրինակ՝ Item item = new Item(); item.id = 42; item.name = «Նյութի անվանումը»; item.values ​​= new List(); item.values.Add(12.34); item.values.Add(56.78); SaveXml (հատ, «d:\\obj.xml»); Նյութ obj = LoadXml(typeof(Item), "d:\\obj.xml") որպես տարր; Այժմ մի փոքր XML սերիալացման այս մեթոդի ճկունության մասին: Առաջին հարցն այն է, թե ինչպես կարելի է սերիականացնել դասի անդամը որպես հանգույցի հատկանիշ: Դա անելու համար պարզապես դրան կցեք հատկանիշը: Դուք կարող եք վերանվանել այս հատկանիշը՝ օգտագործելով պարամետրը՝ . Եթե ​​մեզ անհրաժեշտ է պահպանել դասի անդամը որպես նորմալ հանգույց, ապա մենք ոչինչ չենք կարող գրել: Չնայած, եթե մենք պետք է վերանվանենք հանգույցը, մենք կարող ենք տեղադրել . Ինչ վերաբերում է օբյեկտների հավաքածուներին, ապա պետք է նշել, որ հավաքածուի հանգույցների վերանվանումը նույնքան պարզ է, որքան սովորական տարրերը: Դա անելու համար ատրիբուտները և տեղադրվում են հավաքածուից առաջ: Որպես այս հատկանիշների պարամետր, դուք կարող եք փոխանցել այն հանգույցների անունները, որոնք համապատասխանաբար կպահեն հավաքածուն և դրա տարրերը: Եթե ​​մենք չենք ցանկանում որևէ տարր պահել XML-ում, կարող ենք այն նշել . Նկարագրված մեթոդը թույլ է տալիս շատ արագ «սովորեցնել» ծրագրին աշխատել տարբեր XML-ներով։ Իսկ դրա համար պետք չէ յուրաքանչյուր XML ֆորմատի համար առանձին կոդ գրել։ Բավական է դեկլարատիվ ձևաչափը նկարագրել որպես C# դաս՝ անհրաժեշտ ատրիբուտներով։