LINQ to XML (Part 3)

Posting LINQ part ke 3,akan membahas tentang pengunaan LINQ dalam melakukan query terhadap data XML, sebagai contoh sederhana kita mempunyai XML yang berisi contact seperti berikut:

[javascript]

<?xml version="1.0" encoding="utf-8" ?>
<Contact>
<ContactPerson id="01">
<nama>Jerry Peter</nama>
<email>jerry.peter@gmail.com</email>
<blog>www.ruangkecil.or.id</blog>
</person>
<ContactPerson id="02">
<nama>Jerry</nama>
<email>jerry@gmail.com</email>
<blog>www.jerry.com</blog>
</ContactPerson >
<ContactPerson id="03">
<nama>peter</nama>
<email>peter@yahoo.com</email>
<blog>www.peter.com</blog>
</ContactPerson >
</Contact>

[/javascript]

Dari format diatas terlihat masing-masing contactPerson memiliki (Nama, email dan blog), selanjutnya misalkan kita ingin mengambil data NAMA saja dari struktur XML contact diatas. Yang perlu kita lakukan adalah melakukan load data XML tersebut kedalam sebuah variable kemudian dengan bantuan LINQ kita tuliskan sintaks sederhana berikut:

[javascript]

Dim LINQ = From nama In ContactXML…<nama> _
Select nama.value

[/javascript]

Sederhana sekali bukan 🙂

Mungkin terlihat keyword yang baru dari sintaks diatas yaitu tanda � (titik titik titik)
Keyword ini terdapat pada VS 2008 dan dapat kita gunakan untuk mengambil data TAG ELEMENT XML yang langsung kita perlukan, dari contoh diatas kita mengambil semua element dengan TAG <NAMA> dari struktur data XML yang ada.

Jika pernah mengunakan pembacaan struktur DOM (Document Object Model) mungkin keyword � ini sama dengan pengunaan pembacaan dengan method getElementByTagName.

Pada VS 2008 kita juga dapat menuliskan langsung struktur format XML kedalam sebuah variable dengan cara berikut:

[javascript]

Dim ContactXML = <?xml version="1.0" encoding="utf-8"?>
<Contact>
<ContactPerson id="01">
<nama>Jerry Peter</nama>
<email>jerry.peter@gmail.com</email>
<blog>www.ruangkecil.or.id</blog>
</ContactPerson>
<ContactPerson id="02">
<nama>Jerry</nama>
<email>jerry@gmail.com</email>
<blog>www.jerry.com</blog>
</ContactPerson>
<ContactPerson id="03">
<nama>peter</nama>
<email>peter@yahoo.com</email>
<blog>www.peter.com</blog>
</ContactPerson>
</Contact>

[/javascript]

Dengan penulisan diatas maka secara automatis variable ContactXML akan memiliki format type data XDocument, dan juga langsung memapung data format XML yang kita tuliskan.

Jika diperhatikan lagi penulisan nilai data diatas kita tidak perlu memisahkan masing-masing baris dengan mengunakan separator � _ � dan VS2008 tetap mengetahui maksud data selanjutnya masih tetap bagian dari format XML yang sedang kita tuliskan. Dan jika kita mencoba menuliskan sebuah TAG baru kedalam format XML yg sedang dituliskan VS2008 juga secara automatis membuatkan TAG penutup untuk kita.
Sekarang coba kita gabungkan script diatas kedalam sebuah contoh project sederhana pembacaan XML dengan LINQ, pertama buatlah sebuah project Visual Basic pada Visual Studio kemdian tambahkan sebuah tombol kedalam form yang ada, dan tuliskan script berikut kedalam event click tombol tersebut.

[javascript]

Dim ContactXML = <?xml version="1.0" encoding="utf-8"?>
<Contact>
<ContactPerson id="01">
<nama>Jerry Peter</nama>
<email>jerry.peter@gmail.com</email>
<blog>www.ruangkecil.or.id</blog>
</ContactPerson>
<ContactPerson id="02">
<nama>Jerry</nama>
<email>jerry@gmail.com</email>
<blog>www.jerry.com</blog>
</ContactPerson>
<ContactPerson id="03">
<nama>peter</nama>
<email>peter@yahoo.com</email>
<blog>www.peter.com</blog>
</ContactPerson>
</Contact>

Dim LINQ = From nama In ContactXML…<nama> _
Select nama.Value

Dim hasil = "– DATA PADA TAG NAMA –" & vbCrLf & vbCrLf
For Each nama In LINQ
hasil = hasil & nama.toString & vbCrLf
Next

MsgBox(hasil)

[/javascript]

Setelah selesai coba RUN project tersebut, dan click tombol yang ada. Jika lancar seharusnya akan muncul MessageBox dengan data seperti gambar berikut:

LINQ2XML

LINQ2XML

Perlu diperhatikan sedikit penulisan SELECT pada LINQ diatas kita menuliskan sintaks berikut, dimana kita langsung mengambil VALUE dari tag <nama>

[javascript]

Dim LINQ = From nama In ContactXML…<nama> _
Select nama.Value

[/javascript]

Jika kita ganti script diatas dengan script berikut

[javascript]
Dim LINQ = From nama In ContactXML…<nama> _
Select nama
[/javascript]

Dan coba jalankan kembali program tersebut maka akan ditampilkan hasil seperti gambar berikut:

LINQ2XML

LINQ2XML

Data yang dihasilkan akan berisi semua TAG NAMA secara lengkap berikut dengan data TAG yang XML-nya. Pengunaan VALUE sebelumnya mungkin sama dengan penulisan innerHtml jika kita pernah mengunakan pembacaan dengan DOM.

Load XML data
Selanjutnya kita mencoba melakukan pembacaan data XML pada sebuah file terpisah bukan dengan penulisan langsung seperti pada contoh sebelumnya.

Untuk melakukan LOAD data XML kedalam sebuah variable kita akan mengunakan fasilitas load pada object XDocument, penulisan sintaksnya seperti berikut:

[javascript]
Dim <nama variable> = XDocument.Load(<URL data xml>)
[/javascript]

Untuk mencoba kita gunakan contoh sebelumnya, namun sekarang kita coba pisahkan data XML kedalam file terpisah.� Untuk membuat XML data pada file terpisah kita perlu menambahkan sebuah file XML dari menu Solution Explorer Click kanan pilih ADD –> new item.

add-item

add-item

Kemudian pilih XML File untuk tipe document yg akan ditambahkan, dan beri nama DATA.XML untuk contoh ini. Setelah selesai tuliskan ulang struktur XML sebelumnya ada cukup di copy dan paste ulang data sebelumnya.

add-xml2

add-xml2

[javascript]
<?xml version="1.0" encoding="utf-8" ?>
<Contact>
<ContactPerson id="01">
<nama>Jerry Peter</nama>
<email>jerry.peter@gmail.com</email>
<blog>www.ruangkecil.or.id</blog>
</ContactPerson>
<ContactPerson id="02">
<nama>Jerry</nama>
<email>jerry@gmail.com</email>
<blog>www.jerry.com</blog>
</ContactPerson>
<ContactPerson id="03">
<nama>peter</nama>
<email>peter@yahoo.com</email>
<blog>www.peter.com</blog>
</ContactPerson>
</Contact>
[/javascript]

Dari form yang ada sebelumnya tambahkan sebuah tombol baru kedalamnya dan tuliskan script berikut kedalam event click tombol yg baru ditambahkan untuk melakukan LOAD data XML dari file terpisah dan melakukan pembacaan data didalamnya.

[javascript]

Dim contactXML = XDocument.Load(CurDir() & "\data.xml")

Dim LINQ = From nama In contactXML…<nama> _
Select nama

Dim hasil = "– DATA PADA TAG NAMA –" & vbCrLf & vbCrLf
For Each nama In LINQ
hasil = hasil & nama.ToString & vbCrLf
Next

MsgBox(hasil)
[/javascript]

Selanjutnya coba jalankan dan kembali project tersebut dan tekan tombol yang baru ditambahkan, jika tidak ada masalah seharusnya hasil masih sama dengan contoh sebelumnya dengan menampilkan MSGBOX baru berisi data TAG NAMA.

Catatan:
Saat menekan tombol baru yang dibuat sebelumnya, mungkin muncul pesan error seperti berikut :

LINQ2XML

LINQ2XML

Tenang kesalahan bukan pada script kita, jika diperhatikan proses program curdir() pencarian data XML mengacu pada folder debug bukan pada root program project kita, hal ini karena saat melakukan debugging VS menjalankan program temporary yang dibuat pada folder [NamaProject] –> BIN –> [Debug], bukan pada folder root project.

Untuk mengatasi error tsb kita cukup copy saja DATA.XML kita kedalam folder tersebut untuk keperluan selama proses debugging.

Dari contoh sebelumnya kita coba gantikan proses LINQ yg ada dgn script berikut, dan coba jalankan kembali dan perhatikan hasil yang ditampilkan:

[javascript]
Dim LINQ = From nama In contactXML…<ContactPerson> _
Select nama
[/javascript]

Hasil proses dengan script pembacaan tag element <ContactPerson>

hasil-xml

hasil-xml

Jika kita mencoba mencari sebuah tag Element <ContactPerson>, maka semua data ChildElement yang ada dari TAG yang kita minta akan ikut terambil. Dari contoh ini <ContactPerson> memiliki 3 buah childElement (<nama>,<email>,<url>).

Catatan:
Perlu diperhatikan juga pengunaan pencarian TAG element ini bersifat Case Sensitive atau penulisan nama TAG harus benar-benar sama , pengunaan Huruf besar dan kecil akan bepengaruh pada proses pencarian.

MEMBUAT XML DOCUMENT DENGAN LINQ
Penjelasan sebelumnya kita membahas pembacaan sebuah document XML, sekarang kita coba membuat sebuah XML dan mengkombinasikannya dengan pengunaan LINQ untuk proses pengambilan data.

Seperti dijelaskan sebelumnya kita dapat menuliskan langsung struktur XML document kedalam sebuah variable, selain XML statis kita juga dapat membuat dynamic XML untuk nilai data yg ingin kita tampilkan.

Sebagai contoh kita gunakan script berikut untuk membuat XML document yang mengambil data JAM dari computer kita.

[javascript]
Dim oXML = <?xml version="1.0" encoding="utf-8"?>
<Jam>
<%= Now() %>
</Jam>

My.Computer.FileSystem.WriteAllText ("c:\first.xml", oXML.ToString, False)

Process.Start("c:\first.xml")
[/javascript]

Baris 1,2,3,4 �� �: Proses pembuatan XML data dengan 1 buah tag yang kita beri nama <jam>, isi value dari tag ini akan mengambil dynamic data dari waktu yang ada pada komputer kita dengan sintaks <%= Now() %>
Baris 6,7�� �: Memanfaatkan My keyword untuk membuat file XML baru C:\First.xml yang datanya diambil dari variable oXML yang telah dibuat sebelumnya.
Baris 9�� �: Membuka file c:\first.xml yang baru selesai dibuat.

Setelah selesai coba jalankan proses diatas, jika tidak ada masalah seharusnya akan ditampilkan data first.xml yang baru kita buat pada sebuah browser seperti gambar berikut:

xml-hasil2

xml-hasil2

Contoh diatas belum mengunakan LINQ dalam proses pembuatan data, kita baru mencoba proses sederhana membuat sebuah document XML yang mengambil data secara dynamic.

Sekarang kita coba mengunakan LINQ to OBJECT untuk membuat sebuah data XML, disini kita akan membaca daftar program yang berajalan pada computer kita.

Untuk mengambil daftar proses berjalan pada computer, kita mengunakan sintaks berikut :

[javascript]

System.Diagnostics.Process.GetProcesses

[/javascript]

Dari sintaks diatas kita akan mendapatkan daftar proses yang sedang berjalan pada computer kita seperti yang terdapat pada Task manager, dari daftar tersebut kita akan mencoba membuat XML file yang berisi daftar proses berjalan pada computer kita, untuk mencoba proses ini tuliskan script berikut apda sebuah event tombol click yang ada pada form project kita.

Tambahkan sebuah tombol kedalam form yang ada pada project kita, kemudian tuliskan script berikut pada sebuah event click tombol tersebut:

[javascript]
Dim oXML = <?xml version="1.0" encoding="utf-8"?>
<TaskManager>
<%= From p In System.Diagnostics.Process.GetProcesses _
Select <proses>
<id><%= p.Id %></id>
<nama><%= p.ProcessName %></nama>
<memory><%= p.PagedMemorySize %></memory>
</proses> %>
</TaskManager>

My.Computer.FileSystem.WriteAllText _
("c:\proses.xml", oXML.ToString, False)

Process.Start("c:\proses.xml")
[/javascript]

Proses pembuatan dynamic data XML dengan LINQ terletak pada bagian script berikut:

[javascript]
<%= From p In System.Diagnostics.Process.GetProcesses _
Select <proses>
<id><%= p.Id %></id>
<nama><%= p.ProcessName %></nama>
<memory><%= p.PagedMemorySize %></memory>
</proses> %>
[/javascript]

Disini LINQ akan mengambil object proses berjalan pada system komputer kita, kemudian hasil query yang didapat akan dibuat sebagai struktur data ELEMENT XML <proses> yang didalamnya terdapat 3 buah childElement (id, nama dan memory). Jika kita jalankan proses tersebut nantinya akan terbentuk file c:\proses.xml yang berisi data proses yang sedang berjalan pada computer kita.
Bagian terakhir dari script diatas Process.Start(“c:\proses.xml”)adalah untuk menampilkan data hasil proses, secara default proses akan membuka browser untuk memampilkan data XML yang telah terbentuk seperti gambar berikut:

xml-hasil2

xml-hasil2

Related Posts



1 Comment

Leave a Reply