Linq to Xml هي واجهة برمجة xml في الذاكرة تدعم Linq تمكنك من العمل مع بيانات xml المختلفة من داخل لغة برمجة الـ .net Framework وهي مشابهة لـ Document Object Model واختصارا DOM التي تضع الـ xml في الذاكرة حيث يمكنك الاستعلام من الوثيقة أو التعديل عليها ثم يمكنك حفظها أو إرسالها بعد التعديل ولكن تختلف Linq to xml عن DOM في أنها تزود نموذج غرضي Object Model أخف وأسهل عند العمل عليه وهي تستفيد من تطويرات اللغة في الـ 2008
وتكمن الميزة الأهم التي تقدمها Linq to Xml هي التكامل مع Linq الذي يمكنك من كتابة استعلامات من وثيقة xml في الذاكرة للحصول على مجموعة من العناصر والصفات التي تمتد لتشمل xPath و Xquery وتقدم لك ميزات إضافية مثل اكتشاف الأخطاء في وقت الترجمة ودعم أفضل للمدقق Debugger إضافة إلى ترميز أقوى وإمكانية استخدام نتائج الاستعلامات كوسائط لبانيات XElement أو XAttribute توفر طريقة سهلة لإنشاء أشجار xml وهي تدعى Functional Construction التي تمكن المطورين بسهولة من تحويل أشجار xml بسهولة من شكل إلى آخر.
وتمكنك امكانيات Linq في Linq to xml من كتابة استعلامات من xml فقد يكون لديك ملف xml يمثل طلب مشتريات كالتالي
PurchaseOrder.xml <?xml version="1.0"?> <PurchaseOrder PurchaseOrderNumber="99503" OrderDate="1999-10-20"> <Address Type="Shipping"> <Name>Ellen Adams</Name> <Street>123 Maple Street</Street> <City>Mill Valley</City> <State>CA</State> <Zip>10999</Zip> <Country>USA</Country> </Address> <Address Type="Billing"> <Name>Tai Yee</Name> <Street>8 Oak Avenue</Street> <City>Old Town</City> <State>PA</State> <Zip>95819</Zip> <Country>USA</Country> </Address> <DeliveryNotes>Please leave packages in shed by driveway.</DeliveryNotes> <Items> <Item PartNumber="872-AA"> <ProductName>Lawnmower</ProductName> <Quantity>1</Quantity> <USPrice>148.95</USPrice> <Comment>Confirm this is electric</Comment> </Item> <Item PartNumber="926-AA"> <ProductName>Baby Monitor</ProductName> <Quantity>2</Quantity> <USPrice>39.98</USPrice> <ShipDate>1999-05-21</ShipDate> </Item> </Items> </PurchaseOrder>
فباستخدام Linq to xml يمكنك تشغيل استعلام للحصول على القيمة المقابلة للصفة PartNumber من أجل كل عنصر في طلب المشتريات
Dim purchaseOrder As XElement = XElement.Load("PurchaseOrder.xml", LoadOptions.SetBaseUri Or LoadOptions.SetLineInfo)
Dim partNos = _
From item In purchaseOrder...<Item> _
Select item.@PartNumberوقد تريد الحصول على قائمة مرتبة باستخدام PartNumber بالعناصر التي تحمل القيمة أكثر من 100 وللحصول على هذه المعلومات يمكننا كتابة الاستعلام
Dim partNos = _ From item In purchaseOrder...<Item> _ Where (item.<Quantity>.Value * _ item.<USPrice>.Value) > 100 _ Order By item.<PartNumber>.Value _ Select item
وباستخدام Linq to xml يمكنك عمل العديد من الأشياء كتحميل ملف من القرص أو تخزين ملف إلى القرص أو إنشاء بيانات xml من الصفر أو الاستعلام باستخدام Xpath أو حتى التعامل مع أشجار xml من حيث الإضافة والحذف والتعديل والتأكد من صحة أشجار xml باستخدام XSD أو استخدام مجموعة مما ورد هنا لتحويل أشجار xml من شكل إلى آخر
وهناك طريقتان لإنشاء أشجار xml في Visual Basic إما بتعريف xml مباشرة في الكود أو باستخدام Linq APIs لإنشاء الشجرة وكلتا الطريقتين تمكنان الكود من عكس بنية xml شجرية كاملة فالكود التالي مثلا ينشئ عنصر xml
Dim contact1 As XElement = _ <contact> <name>Patrick Hines</name> <phone type="home">206-555-0144</phone> <phone type="work">425-555-0145</phone> </contact>
ويقدم فيجول بايزيك عدة خصائص للتنقل عبر بنية xml والتي تمكنك من الوصول إلى عناصر وصفات xml عن طريق تحديد اسم عنصر xml الابن أو يمكنك استدعاء طرائق Linq لتحديد العناصر الأبناء لعنصر xml فالكود التالي مثلا يستخدم خصائص xml للإشارة إلى الصفات والعناصر الأبناء لعنصر xml مستخدما استعلام Linq للحصول على العناصر الأبناء وإخراجهم كعنصر xml
' Place Imports statements at the top of your program. Imports <xmlns:ns="http://SomeNamespace"> Module Sample1 Sub SampleTransform() ' Create test by using a global XML namespace prefix. Dim contact = _ <ns:contact> <ns:name>Patrick Hines</ns:name> <ns:phone ns:type="home">206-555-0144</ns:phone> <ns:phone ns:type="work">425-555-0145</ns:phone> </ns:contact> Dim phoneTypes = _ <phoneTypes> <%= From phone In contact.<ns:phone> _ Select <type><%= phone.@ns:type %></type> _ %> </phoneTypes> Console.WriteLine(phoneTypes) End Sub End Module
ويمكنك Visual Basic من تحديد اسم مستعار Alias لمجال أسماء Xml باستخدام عبارة Imports كما في الكود التالي الذي يرينا كيف يمكننا استخدام العبارة Imports لاستيراد مجال أسماء XML
Imports <xmlns:ns="http://someNamespace">
حيث يمكنك استخدام هذا الاسم المستعار للوصول إلى خصائص xml ولتحديد محارف xml من أجل وثيقة وعناصر xml ويمكننا الحصول على غرض XNamespace من أجل أي بادئة مجال أسماء باستخدام المعامل GetXmlNamespace كما في المثال
' Place Imports statements at the top of your program.
Imports <xmlns:ns="http://SomeNamespace">
Module GetXmlNamespaceSample
Sub RunSample()
' Create test by using a global XML namespace prefix.
Dim contact = _
<ns:contact>
<ns:name>Patrick Hines</ns:name>
<ns:phone ns:type="home">206-555-0144</ns:phone>
<ns:phone ns:type="work">425-555-0145</ns:phone>
</ns:contact>
ShowName(contact.<ns:phone>(0))
End Sub
Sub ShowName(ByVal phone As XElement)
Dim qualifiedName = GetXmlNamespace(ns) + "contact"
Dim contact = phone.Ancestors(qualifiedName)(0)
Console.WriteLine("Name: " & contact.<ns:name>.Value)
End Sub
End Moduleويرينا المثال التالي كيفية إنشاء XElemnt باستخدام مجال الأسماء العام ns
Dim contact1 As XElement = _ <ns:contact> <ns:name>Patrick Hines</ns:name> <ns:phone type="home">206-555-0144</ns:phone> <ns:phone type="work">425-555-0145</ns:phone> </ns:contact> Console.WriteLine(contact1)
ويقوم مترجم فيجول بايزيك بترجمة محارف xml التي تحتوي الأسماء المستعارة لمجالات أسماء Xml إلى الكود المكافئ الذي يستخدم تدوين Xml المستخدم في تلك المجالات وباستخدام الصفة xmlns عند الترجمة والكود السابق يولد نفس الكود التنفيذي الذي يولده الكود التالي
Dim contact2 As XElement = _ <ns1:contact xmlns:ns1="http://someNamespace"> <ns1:name>Patrick Hines</ns1:name> <ns1:phone type="home">206-555-0144</ns1:phone> <ns1:phone type="work">425-555-0145</ns1:phone> </ns1:contact> Console.WriteLine(contact2)
يمكن استخدام مجالات أسماء Xml العامة مع خصائص Xml كما في المثال التالي
Console.WriteLine("Contact name is: " & contact1.<ns:name>.Value)