نوشتن 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 باز کنید
File = New XMLReader();
File.OpenFile("D:\ConfigurationStructure.xml");

//درخت مقدار را آماده کنید
//هر شاخه XML می تواند یک نام، ویژگی و مقدار داشته باشد
dzXML = New ValueTree();
dzXML.Columns.Add("Name");
dzXML.Columns.Add("Value");
dzXML.Columns.Add("ویژگی ها");

//از آنجایی که یک رشته XML می تواند چندین ویژگی داشته باشد، آنها را در جدول مقدار می نویسیم
//هر ویژگی یک نام و مقدار دارد
tAttributes = NewValueTable();
ویژگی.Columns.Add("Name");
ویژگی.Columns.Add("Value");

// سطح تودرتو به ما کمک می کند بفهمیم چه زمانی باید یک شاخه تودرتو اضافه کنیم و چه زمانی باید به سطح بالا برگردیم
NestingLevel = 0;
// خط فعلی - خط درخت، با افزایش تودرتو تغییر خواهد کرد
CurrentRow = Undefined;
//خواندن فایل XML 1C خط به خط انجام نمی شود، اما طبق ساختار، در انتهای فایل، خواندن FALSE برمی گردد.
در حالی که File.Read() حلقه بزنید

//ما به سه نوع گره علاقه مندیم - ابتدای عنصر، متن (مقدار عنصر) و انتهای عنصر (برای بازگرداندن یک سطح به بالا)
اگر File.NodeType = XMLNodeType.ElementStart سپس

NestingLevel = NestingLevel + 1;

//اگر این اولین خط است، آن را به بالای درخت اضافه کنید و فقط نام را ذخیره کنید
اگر CurrentRow = Undefined then
CurrentRow = dzXML.Rows.Add();
CurrentLine.Name = File.Name;
ادامه
در غیر این صورت
// خطوط تو در تو
CurrentRow = CurrentRow.Rows.Add();
CurrentLine.Name = File.Name; //ذخیره نام

//آیا این عنصر دارد ویژگی های XML?
اگر File.NumberAttributes() > 0 سپس
//اگر بله - جدول خالی آماده شده را برای ذخیره ویژگی ها کپی کنید
tAttributesNode = tAttributes.Copy();
//تعداد ویژگی های این عنصر را حلقه بزنید
برای تعداد = 0 توسط File.NumberAttributes() -1 حلقه
//برای هر ویژگی نام و مقدار را به خاطر بسپارید
String = tNodeAttributes.Add();
String.Name = File.AttributeName(N);
String.Value = File.AttributeValue(Ac);
چرخه پایان
// جدول ویژگی عنصر را در ردیف فعلی ذخیره کنید
CurrentRow.Attributes = tAttributesNode;
EndIf
EndIf

ElseIf File.NodeType = XMLNodeType.EndElement سپس
// افزایش سطح تودرتو در ابتدای عنصر، کاهش سطح تودرتو در انتهای عنصر
NestingLevel = NestingLevel - 1;
//خط فعلی را یک سطح به بالا برگردانید
CurrentRow = CurrentRow.Parent;

ElseIf File.NodeType = XMLNodeType.Text سپس
//اگر عنصر دارای مقدار است، فقط آن را ذخیره کنید
CurrentLine.Value = File.Value;

EndIf

چرخه پایان

File.Close();

مثال 2. نوشتن یک فایل XML 1C با استفاده از شی WriteXML 1C

//یک فایل WriteXML 1C ایجاد کنید
File = New XMLWriter();
File.OpenFile("D:\ConfigurationStructure.xml"، "UTF-8");
File.WriteItemStart("پیکربندی");

// توسط ابرداده همه دایرکتوری ها را دور می زنیم (برای جزئیات بیشتر، به "کار با ابرداده" مراجعه کنید)
برای هر فهرست از Metadata.Catalogs Loop

//WriteItemStart - یک شاخه [فرعی] جدید باز می کند
File.WriteItemStart("Directory");
//WriteAttribute - ویژگی را در شاخه ای که قبلا باز شده می نویسد
File.WriteAttribute("Name", Directory.Name);
File.WriteAttribute("مترادف"، Directory.Synonym);

// توسط ابرداده تمام جزئیات دایرکتوری را دور می زنیم
برای هر Props از Handbook.Props Cycle




چرخه پایان

// توسط ابرداده همه قسمت های جدولی دایرکتوری را دور می زنیم
برای هر PM از حلقه Directory.TabularParts
File.WriteItemBeginning("TablePart");
File.WriteAttribute("Name", PT.Name);
File.WriteAttribute("مترادف"، PM.Synonym);

برای هر Props از چرخه PM.Props
File.WriteItemBeginning("Props");
File.WriteAttribute("Name", Props.Name);
File.WriteAttribute("مترادف"، Props.Synonym);
File.WriteEndElement();
چرخه پایان

File.WriteEndElement();
چرخه پایان

//SaveItemEnd - شعبه باز شده قبلی را با استفاده از WriteItemStart "بست".
File.WriteEndElement();
چرخه پایان

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

در این مقاله می خواهم روشی برای نوشتن و خواندن فایل های XML با استفاده از کلاس XmlSerializer شرح دهم. این کلاس در فضای نام System.Xml.Serialization مجموعه System.Xml.dll قرار دارد. خیلی وقت پیش - حتی در اولین نسخه های دات نت - ظاهر شد. یک شی از این کلاس دو روش جالب دارد - Serialize و Deserialize. این مقاله در مورد نحوه خواندن یا نوشتن یک فایل XML تقریباً با هر ساختاری با توصیف آن با کلاس های ساده در C# است. برای درک اینکه استفاده از این روش ها بسیار راحت است، مثالی از یک کلاس ارائه می کنم:

آیتم کلاس عمومی ( شناسه عمومی عمومی، نام رشته عمومی، مقادیر فهرست عمومی، بوول عمومی CurrentStatus؛ ) این کلاس به راحتی می تواند به XML زیر تبدیل شود:12.34ElementName> 56.78ElementName>CollectionName>RootElementName> برای انجام این کار، اجرای دو روش که مجموعه‌ای از متدهای سریال‌سازی (SaveXml) و deserialization (LoadXml) را محصور می‌کند، کافی است: عمومی static bool (SaveXml stol (رینگ نتیجه نام فایل) = نادرست؛ با استفاده از ( StreamWriter writer = StreamWriter جدید (نام فایل)) ( امتحان کنید ( XmlSerializerNamespaces ns = new XmlSerializerNamespaces(); ns.Add(")، ""); XmlSerializer serializer = new XmlSerializer(obj.GetT); .Serialize(writer, obj, ns)؛ نتیجه = درست؛ ) catch (Exception e) ( // Logging ) در نهایت ( writer.Close(); ) ) نتیجه را برمی گرداند؛ ) public object static LoadXml (نوع نوع، نام فایل رشته) (نتیجه شی = پوچ؛ با استفاده از (StreamReader reader = StreamReader جدید (نام فایل)) ( سعی کنید (XmlSerializer serializer = new XmlSerializer(نوع); result = 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 ندارید. کافی است فرمت را به صورت یک کلاس سی شارپ با ویژگی های لازم توصیف کنیم.