نحوه تبدیل XML در NET Core.
نوشته شده توسط : عباسی

تا قبل از این در زمینه‌ی شیوه تبدیل JSON در NET Core. حرف کردیم. طراحی اپلیکیشن بیشتر آن را به‌این عامل نوشتیم که پندار می‌کردیم اشخاص برای عمل با JSON خویش را به مشقت می‌اندازند.


ما فکر می کنیم شغل با XML یه خرده متعدد میباشد. هنوز کتابخانه استاندارد خیر برای شغل با XML نیست.

برخلاف JSON که دارنده کتابخانه JSON.NET که برای رئیس هر چیزی میباشد، بیشتر مورد ها هنگامی با XML شغل می کنید، از یکی‌از Parserهای داخلی XML در قاب‌ورک NET Core. استعمال خواهید کرد. این‌ها ممکن میباشد پاره ای ناامیدکننده باشند. برخی از این مفاد این میباشد که آنان در اوایل ایجاد کرد NET. ساخت گردیده‌اند و به همین عامل، مدام بایستی با موردها قبل سازگار باشند به این ترتیب شما در چیزهایی مثل Generics ناکامی می‌خورید. آیتم دیگر این میباشد که خصوصیات حقیقی وواقعی XML که دربرگیرنده مواقعی مانند فضای اسم‌ها (namespace) و DTDها میگردد، گرچه در بالا معمولی به حیث می رسد، ولی می تواند فوق‌العاده خشن باشد. مراد ما از خشن این میباشد که در حالتی که تنها یک قطعه از جورچین را از دست بدهید، تمامی چیز به آسانی فعالیت نخواهد کرد و ممکن میباشد ساعت ها ارتفاع بکشد تا مشاهده کنید چه چیزی نادرست میباشد.

به هر درحال حاضر، بیاید سریع برویم و آیتم‌های مرتبط با شغل با XML در NET. را تحقیق کنیم.

مثالی برای پوشه XML

ما می خواهیم از یک پوشه XML خیلی معمولی استعمال کنیم که دارنده المنت، پراپرتی اتربیوت و یک لیست میباشد. ما هنگام نظارت مورد‌ها از این مورد ها استعمال میکنیم، بدین ترتیب مدام عملکرد میکنیم فولدر شبیه‌ای را بخوانیم.

 

Abc


1
2
3


استعمال از XMLReader

بهتر او‌لین مورد‌ای که داریم استعمال از کلاس \" XMLReader\" میباشد. این تنها یک XML Parser رو به جلو میباشد (مراد ما این میباشد که فولدر را به طور تقریب خط به خط میخواند). این آیتم خیلی ابتدایی میباشد. به عنوان مثال کد شما ممکن میباشد خیلی مشابه بدین باشد:

XmlReaderSettings settings = new XmlReaderSettings();
settings.IgnoreWhitespace = true;

using (var fileStream = File.OpenText(\"test.xml\"))
using(XmlReader reader = XmlReader.Create(fileStream, settings))
{
while(reader.Read())
{
switch(reader.NodeType)
{
case XmlNodeType.Element:
Console.WriteLine($\"Start Element: {reader.Name}. Has Attributes? : {reader.HasAttributes}\");
break;
case XmlNodeType.Text:
Console.WriteLine($\"Inner Text: {reader.Value}\");
break;
case XmlNodeType.EndElement:
Console.WriteLine($\"End Element: {reader.Name}\");
break;
default:
Console.WriteLine($\"Unknown: {reader.NodeType}\");
break;
}
}
}
با خروجی مانند این:

Unknown: XmlDeclaration
Start Element: MyDocument. Has Attributes? : True
Start Element: MyProperty. Has Attributes? : False
Inner Text: Abc
End Element: MyProperty
Start Element: MyAttributePropety. Has Attributes? : True
Start Element: MyList. Has Attributes? : False
Start Element: MyListItem. Has Attributes? : False
Inner Text: 1
End Element: MyListItem
Start Element: MyListItem. Has Attributes? : False
Inner Text: 2
End Element: MyListItem
Start Element: MyListItem. Has Attributes? : False
Inner Text: 3
End Element: MyListItem
End Element: MyList
End Element: MyDocument
این آیتم یادآور به کارگیری از ADO.NET و تلاوت سطر به سطر داده‌ها و عملکرد برای انبارکردن آن در یک آبجکت میباشد. ایده کلی به‌این عامل میباشد که به طور خط به خط تبدیل را اجرا می‌دهید، و یاد کمتری داراست. ولی شما همینطور می بایست هر خط را به طور غیروابسته با هر تعداد جایگشت از موادسازنده، اتربیوت‌ها، لیست‌ها و غیره مدیر فرمایید. ما فکرمی کنیم صرفا ادله به کار گیری از این روال می تواند در حالتی‌که باشد که شما فولدر‌های خیلی والا XML را دارید (بیشتر از 100 مگابایت) یا این که در ادامه موردها بسیار خاص میباشید. به عنوان مثال تنها میخواهید یک عنصر را از پوشه بخوانید، و زمانی در‌پی آن یک عنصر می باشید، نمیخواهید تمامی چیز را بار گذاری نمایید.

نکته دیگری که می خواهیم به آن اشاره کنم این میباشد که فضای اسم‌های XML و اختلال پیرامون آنان همپا با XMLReader نیستند.

به کارگیری از XPathDocument/XPathNavigator

بهتر طرز دیگر اخذ گره‌های (Node) اختصاصی XML که می تواند یک مدرک را کاوش نماید، به کارگیری از آبجکت XPathNavigator میباشد.

آغاز، کد را ببینیم:

using (var fileStream = File.Open(\"test.xml\", FileMode.Open))
{
//Load the file and create a navigator object.
XPathDocument xPath = new XPathDocument(fileStream);
var navigator = xPath.CreateNavigator();

//Compile the query with a namespace prefix.
XPathExpression query = navigator.Compile(\"ns:MyDocument/ns:MyProperty\");

//Do some BS to get the default namespace to actually be called ns.
var nameSpace = new XmlNamespaceManager(navigator.NameTable);
nameSpace.AddNamespace(\"ns\", \"http://www.dotnetcoretutorials.com/namespace\");
query.SetContext(nameSpace);

Console.WriteLine(\"My Property Value : \" + navigator.SelectSingleNode(query).Value);
}
در شرایطی که بخواهیم صادقانه بگوییم این کد نیکی وجود ندارد، و به یک استدلال میتوانیم بگوییم که بد میباشد. فضای اسم‌ها در اینجا حقیقتا منجر زحمت می شوند. در امر خاص ما، از آنجایی که ما یک فضای اسم پیش‌فرض (default namespace) داریم، این فقط راهی بود که می‌توانستیم با XPath فعالیت کنیم. سوای فضای اسم امور حقیقتا به سهولت ایفا می گردند. قادر خواهیم بود بگوییم در هنگام شغل با XML هر دردسری که تا به حالا داشته‌ایم به خیال فضای اسم‌ها بوده میباشد.

بدین ترتیب اذن دهید موردی را به شما بیان کنم. درصورتی که سندی که با آن عمل می کنید از فضای اسم‌ها به کارگیری نمی‌نماید (یا این که مایل به حذف آنها می باشید)، و می بایست از اکسپشن XPath برای اخذ یک گره به کارگیری فرمایید، پس به کارگیری از XMLNavigator در واقع مورد بدی وجود ندارد.

به کارگیری از XMLDocument

XMLDocument میتواند مانند آپ تو دیت رسانی XPathNavigator خلق و خوی نماید. این چندین روال معمولی‌خیس برای بارگذاری کردن سندها داراست، و به شما قابلیت و امکان می دهد XMLDocuments را در یاد نیز اصلاح فرمائید.

XmlDocument document = new XmlDocument();
document.Load(\"test.xml\");

XmlNamespaceManager m = new XmlNamespaceManager(document.NameTable);
m.AddNamespace(\"ns\", \"http://www.dotnetcoretutorials.com/namespace\");
Console.WriteLine(document.SelectSingleNode(\"ns:MyDocument/ns:MyProperty\", m).InnerText);
کلاً شما هنوز هم بایستی با برخی فضای اسم‌ها راز و شغل داشته باشید (برای مثال Default Namespaces به خیر و خوبی رئیس نمی شود)، و شما هنوز هم بایستی هر عنصر را طبق نیاز خویش یک به یک اخذ فرمایید. ولی در صورتی‌که می خواهید تنها یک ذیل تیم خرد از XML را بار گذاری فرمایید، این مورد نیکی میباشد. این حقیقت که میتوانید XML را تغییر‌و تحول دهید و آن را در پوشه ذخیره نمایید نیز یک آیتم بهتر میباشد.

به کارگیری از XMLSerializer

به حیث ما XMLSerializer شایسته ترین مورد برای تبدیل XML در NET Core. میباشد. در صورتیکه پیش از این از JSONDocument از JSON.NET به کار گیری کرده‌اید، فعال سازی آن خیلی مشابه میباشد.

آغاز به آسانی یک کلاس ساخت میکنیم که از پوشه XML صورت گرفته میباشد. ما از دسته‌ای از اتربیوت‌ها برای معلوم کردن روش تلاوت مدرک، اینکه از کدام فضای اسم استعمال میکنیم، حتی اینکه کدام نوع عنصر را برای deserialize آزمون میکنیم (اتربیوت، عنصر یا این که آرایه)، به کارگیری میکنیم.

[XmlRoot(\"MyDocument\", Namespace = \"http://www.dotnetcoretutorials.com/namespace\")]
public class MyDocument
{
public string MyProperty { get; set; }

public MyAttributeProperty MyAttributeProperty { get; set; }

[XmlArray]
[XmlArrayItem(ElementName = \"MyListItem\")]
public List MyList { get; set; }
}

public class MyAttributeProperty
{
[XmlAttribute(\"value\")]
public int Value { get; set; }
}
حقیقتا بی آلایش میباشد. و بعد XML را خوانده و آن را به‌این کلاس تبدیل میکنیم:

using (var fileStream = File.Open(\"test.xml\", FileMode.Open))
{
XmlSerializer serializer = new XmlSerializer(typeof(MyDocument));
var myDocument = (MyDocument)serializer.Deserialize(fileStream);

Console.WriteLine($\"My Property : {myDocument.MyProperty}\");
Console.WriteLine($\"My Attribute : {myDocument.MyAttributeProperty.Value}\");

foreach(var item in myDocument.MyList)
{
Console.WriteLine(item);
}
}
این آیتم فارغ از همت برای اخذ فضای اسم صحیح، سوای سعی برای صحیح عمل کردن Xpath، فعالیت می‌نماید. احتمالا هنگامی استارت به استعمال از XMLSerializer می کنید، تعجب خواهید کرد که چرا تا به درحال حاضر خویش را به زحمت انداخته و کوشش کرده‌اید تا مجدد به طور دستی مستندات XML را بخوانید.

فعلا یک اخطار تبارک وجود دارااست. در شرایطی که حقیقتا به نصیب بزرگی از مستندات اعتنا نمی کنید و صرفا عملکرد می کنید تا یک عنصر عمیق را اخذ فرمائید، ساخت‌و‌ساز این کلاس‌ها و سبک‌های تبارک صرفا برای اخذ یک عنصر می تواند شمارا به زحمت متعددی بیاندازد.

با این حالا، در 99% موردها، از XMLSerializer برای تبدیل XML استعمال نمایید. نسبت به آیتم‌های دیگر کمتر آسیب پذیر میباشد و الگوی بسیار شبیه‌ای را برای JSON serialization دنبال می‌نماید که بدین معناست که هر هر کس با یکی این‌ها شغل نموده باشد، قادر است با دیگری نیز شغل نماید.





:: برچسب‌ها: طراحی اپلیکیشن ,
:: بازدید از این مطلب : 64
|
امتیاز مطلب : 0
|
تعداد امتیازدهندگان : 0
|
مجموع امتیاز : 0
تاریخ انتشار : شنبه 31 ارديبهشت 1401 | نظرات ()
مطالب مرتبط با این پست
لیست
می توانید دیدگاه خود را بنویسید


نام
آدرس ایمیل
وب سایت/بلاگ
:) :( ;) :D
;)) :X :? :P
:* =(( :O };-
:B /:) =DD :S
-) :-(( :-| :-))
نظر خصوصی

 کد را وارد نمایید:

آپلود عکس دلخواه: