LINQ To XML merupakan fitur baru yang terdapat di VB 9.0. Fitur ini digunakan untuk memudahkan melakukan query data yang disimpan di file XML. Sebelumnya hal tersebut dilakukan dengan menggunakan XMLReader, XPathDocument dengan XPath Query sebagai sarana untuk filtering data xml nya. Penggunaan class-class tersebut saya rasakan begitu "merepotkan" :) ...Beruntung lah dengan adanya fitur LINQ To XML ini.
Kali ini saya akan membahas bagaimana caranya melakukan query data xml dan Join data dari dua file xml. Query operator yang digunakan sama dengan hal nya query operator untuk LINQ terhadap object lain. Namun LINQ To XML ini ada sedikit perbedaan dalam hal pengaksesan elemen dan atributnya.
Misalkan saya memiliki file xml seperti dibawah ini (Book.xml) :
<?xml version="1.0" encoding="utf-8" ?>
<Books>
<Book CatID="1">
<Title>Programming Visual Basic 9.0</Title>
<Publisher>Apress</Publisher>
</Book>
<Book CatID="1">
<Title>Programming C# 3.0</Title>
<Publisher>Adison Wesley</Publisher>
</Book>
<Book CatID="2">
<Title>SQL Server 2008 Administration</Title>
<Publisher>MS Press</Publisher>
</Book>
<Book CatID="2">
<Title>MS Access 2007</Title>
<Publisher>Que</Publisher>
</Book>
<Book CatID="3">
<Title>Windows Vista Administration</Title>
<Publisher>Sams</Publisher>
</Book>
<Book CatID="3">
<Title>Windows Server 2008</Title>
<Publisher>MS Press</Publisher>
</Book>
</Books>
Dengan Linq To XML untuk melakukan query data di atas sangatlah mudah. Berikut kode untuk menampilkan data dari atribut CatID, elemen Title dan elemen Publisher :
Option Strict On
Module LinqToXML
Sub Main()
Dim xmlBook = XDocument.Load("../../Book.xml")
Dim xmlData = From elem In xmlBook.Descendants("Book")
For Each elem In xmlData
Dim strID = CStr(elem.Attribute("CatID").Value)
Dim strTitle = CStr(elem.Element("Title").Value)
Dim strPub = CStr(elem.Element("Publisher").Value)
Dim strBook = String.Format( _
"CatID:{0,-2} Title:{1,-30} Publisher:{2}", _
strID, strTitle, strPub)
Console.WriteLine(strBook)
Next
Console.ReadLine()
End Sub
End Module
Untuk load file xml gunakan XDocument class. XDocument class tersebut memiliki Shared Function Load yang membutuhkan input parameter berupa lokasi dari file xml yang akan digunakan.
Fungsi Descendants digunakan untuk mengakses semua elemen-elemen relatif terhadap root elemen. Pada contoh di atas saya ingin akses semua elemen Book. Untuk menampilkan detail data elemen dan atributnya kita lakukan looping terhadap semua koleksi XElement (xmlData).
Fungsi Attribute akan mengembalikan XAttribute type dan digunakan untuk akses atribute pada elemen dimana attribute tersebut berada, sedangkan fungsi Element akan mengembalikan XElement type dan digunakan untuk akses elemen.
Anda dapat melakukan konversi ke primitive data type terhadap value dari elemen dan atribut dengan fungsi yang telah disediakan di .net framework class library. Berikut screen shot hasil eksekusi kode diatas :

VB 9.0 memiliki fitur yang berbeda dengan C# 3.0 dalam hal akses elemen, atribut, dan descendant. Perbedaan tersebut terletak pada fitur axis property yang diberikan dengan simbol ...<> untuk akses Descendant, <> untuk akses element, dan @ untuk akses atribut. Berikut modifikasi kode diatas dengan menggunakan fitur axis properti :
Dim xmlData = From elem In xmlBook...<Book>
For Each elem In xmlData
Dim strID = CStr(elem.@CatID)
Dim strTitle = CStr(elem...<Title>.Value)
Dim strPub = CStr(elem...<Publisher>.Value)
Dapat kita lihat dengan menggunakan axis properti maka penulisan descendant, elemen dan atribute lebih "Human Readable" :)
Lalu bagaimana caranya kalau kita ingin menampilkan data distinct terhadap sebuah elemen atau atribut? Misalkan saya ingin menampilkan data distinct untuk atribut CatID :
Sub Main()
Dim xmlBook = XDocument.Load("../../Book.xml")
Dim xmlData = From elem In xmlBook...<Book> _
Select elem.@CatID Distinct
For Each elem In xmlData
Dim strID = elem
Dim strCatID = String.Format("CatID:{0,-2}", strID)
Console.WriteLine(strID)
Next
Console.ReadLine()
End Sub
Filtering data berdasarkan nilai dari elemen atau atribut tertentu?
Dim xmlData = From elem In xmlBook...<Book> _
Where CStr(elem.@CatID).Equals("1")
Kode diatas digunakan untuk filtering data xml dimana CatID bernilai "1". Cukup sederhana bukan bila kita bandingkan dengan cara XPath Query konvensional? :D
Kemudian sekarang ada pertanyaan lain...Bagaimana caranya kalau saya ingin melakukan join dari dua buah file xml? Misalkan kita memiliki satu file xml dengan nama Category.xml yang isinya sebagai berikut :
<?xml version="1.0" encoding="utf-8" ?>
<Categories>
<Category ID="1">
<Name>Programming</Name>
</Category>
<Category ID="2">
<Name>Database</Name>
</Category>
<Category ID="3">
<Name>Operating System</Name>
</Category>
</Categories>
Saya ingin gabungkan file Book.xml dan file Category.xml yang akan menampilkan output berupa Nama Kategori dari Title buku yang ada beserta Title nya itu sendiri. Mari kita lihat kode dibawah ini :
Sub Main()
Dim xmlBook = XDocument.Load("../../Book.xml")
Dim xmlCategory = XDocument.Load("../../Category.xml")
Dim xmlData = From book In xmlBook...<Book> _
Join cat In xmlCategory...<Category> _
On book.@CatID Equals cat.@ID _
Select cat.<Name>, book.<Title>
For Each elem In xmlData
Dim strCatName = CStr(elem.Name.Value)
Dim strTitle = CStr(elem.Title.Value)
Dim strBook = String.Format( _
"Category:{0,-20} Title:{1,-30}", _
strCatName, strTitle)
Console.WriteLine(strBook)
Next
Console.ReadLine()
End Sub
Untuk Join dua file xml pertama anda harus load terlebih dahulu kedua file xml yang akan digunakan. Setelah itu untuk menggabungkan dua file xml yang telah diload tersebut gunakan perintah Join terhadap descendant elemen yang akan diakses diikuti dengan perintah On terhadap elemen yang digunakan sebagai link diantara kedua file xml. Perintah Equals harus digunakan untuk membandingkan nilai-nilai dari elemen atau atribut. Ya...mungkin perintah tersebut sangat familiar bila kita sering menggunakan perintah SQL dalam melakukan join :) ...Berikut screen shot hasil dari eksekusi kode diatas :

Happy coding Vb-ers :) ...pada artikel selanjutnya saya akan membahas bagaimana caranya melakukan modifikasi data file xml untuk operasi penambahan, hapus, dan edit terhadap elemen atau atribut.