LINQ to XML (Importing xmlns, Accessing and Filtering xml node value without XPathQuery, Strongly typed XElement)

Posted at : Jan/05/2008
4882 Views | 0 Comments

Accessing and Filtering xml node value

Dengan adanya fitur LINQ to XML di .net x 3.5 ini maka programmer tidak perlu direpotkan lagi dengan penggunaan XPath atau XPathDocument dalam mengakses xml node beserta valuenya didalam sebuah xml document. Sebelumnya kita harus menggunakan XPathQuery. Sebenarnya LINQ ini merupakan teknik query yang dipermudah. Ok...tanpa berpanjang lebar mari kita lihat contoh penggunaannya.

Misalkan saya mempunyai sebuah file xml seperti di bawah ini. Untuk generate file xml ini dapat anda lihat caranya pada artikel yang telah saya posting sebelumnya disini.

   1:  <?xml version="1.0" encoding="utf-8"?>
   2:  <Categories>
   3:    <Category Name="Beverages">
   4:      <Products>
   5:        <Name>Chai</Name>
   6:        <Price>$18.00</Price>
   7:        <Stock>39.00</Stock>
   8:        <SupplierInfo>
   9:          <Name>Exotic Liquids</Name>
  10:          <Phone>(171) 555-2222</Phone>
  11:        </SupplierInfo>
  12:      </Products>
  13:      <Products>
  14:        <Name>Chang</Name>
  15:        <Price>$19.00</Price>
  16:        <Stock>17.00</Stock>
  17:        <SupplierInfo>
  18:          <Name>Exotic Liquids</Name>
  19:          <Phone>(171) 555-2222</Phone>
  20:        </SupplierInfo>
  21:      </Products>

file xml diatas hanya potongan dari beberapa record yang ada. Jadi isinya merupakan data products beserta info suppliernya yang dikelompokkan berdasarkan category. Sekarang kita akan melakukan query terhadap file xml tersebut untuk menampilkan nama-nama products beserta price nya untuk semua category. Saya akan buat sebuah Console Application. Tambahkan kode berikut ini pada Sub Main nya :

   1:  Module LINQToXML1
   2:   
   3:      Sub Main()
   4:          Dim xDoc = XDocument.Load("../../categoriesProductsSupplier.xml")
   5:   
   6:          Dim query = From item In xDoc...<Category> _
   7:                      Select item
   8:   
   9:          For Each element In query.<Products>
  10:              Console.WriteLine("{0,-40} {1,-20}", element.<Name>.Value, element.<Price>.Value)
  11:          Next
  12:   
  13:          Console.ReadLine()
  14:      End Sub
  15:   
  16:  End Module

file xml diload lewat XDocument class. Query Expression diatas menggunakan notasi Descendants yaitu "...<>" artinya saya akan akses XElement dimulai dari node "<Category>" relatif terhadap xml root. Kemudian kita dapat menampilkan isi collection tersebut berdasarkan query expression yang telah dibuat dengan menggunakan statement looping For Each...statement looping For Each tersebut menyatakan bahwa item collection yang ingin ditampilkan yaitu dimulai dari elemen "<Products>"...sehingga di dalam looping collection tersebut kita dapat menampilkan nama produk beserta price nya dengan mengetikkan nama node / elemen dan ditampilkan hasilnya dengan memanggil property Value yang return type nya berupa String. Property Value ini merupakan Extension Method dari XElement. Hasilnya dapat dilihat pada gambar dibawah ini :

lalu bagaimana caranya kalau data product yang ditampilkan itu berdasarkan category tertentu. Misalkan saya ingin menampilkan data product dengan category "Beverages", maka yang perlu kita lakukan yaitu memodifikasi query expression dengan menambahkan klausa "Where" mari kita lihat kode nya :

   1:  Dim query = From item In xDoc...<Category> _
   2:              Where item.@Name = "Beverages" _
   3:              Select item

untuk akses atribut digunakan simbol "@" diikuti dengan nama atributnya. Dari kode diatas artinya atribut Name dalam elemen Category bernilai "Beverages". Hasilnya berupa data products dengan category "Beverages" :

kemudian pertanyaan lainnya lagi ialah bagaimana caranya data supplier product tersebut juga ditampilkan? misalnya Phone number dari supplier tsb. Kita lihat modifikasi kode dibawah ini :

   1:  For Each element In query.<Products>
   2:      Console.WriteLine("{0,-40} {1,-20}", _
   3:                    element.<Name>.Value, element.<Price>.Value)
   4:      Console.WriteLine("=====Supplier Info ==> Phone : {0,-30}", _
   5:                    element.<SupplierInfo>.<Phone>.Value)
   6:  Next

perhatikan kode pada line-5...dari kode tersebut kita sudah dapat lihat struktur hirarki elemennya kan :) inilah kelebihan linq to xml di vb 9.0 dibandingkan dengan c# 3.0...variabel "element" tersebut currently berada pada node "<Products>" jadi untuk akses node "<SupplierInfo>" cukup ketikkan kode seperti diatas. Hasilnya ditunjukkan pada gambar dibawah ini :

mudah bukan :)

Strongly Typed XElement

Dari kode diatas untuk akses nama node / elemennya kita harus mengetikkannya secara manual. Hal ini dapat mengakibatkan run time error karena kesalahan pemanggilan nama node / elemennya. Lalu solusinya bagaimana?? Buat schema file xml tersebut (.xsd) yang berisi informasi struktur xml yang bersangkutan.

Bagaimana caranya membuat schema? kita dapat memanfaatkan tools yang telah disediakan oleh Microsoft untuk generate schema berdasarkan file xml, tools tersebut namanya adalah XML To Schema Editor yang dapat anda download di link ini.

Setelah anda install tools tersebut. Langkah selanjutnya adalah tambahkan item baru ke dalam project tersebut berupa "Xml To Schema" :

maka nanti akan muncul xml to schema editor yang kita gunakan untuk inferring schema xml file dengan klik tombol "Add from File" untuk mencari file xml yang akan dijadikan sebagai source .xsd nya :

jika sukses maka akan terdapat file .xsd di project anda :

sekarang kita akan ketikkan ulang kembali kode yang digunakan untuk deklarasi variabel query expressionnya beserta kode untuk looping item collection. Pada gambar dibawah ini dapat kita lihat bahwa sekarang kalau kita akses XElement maka akan muncul nama node / elemennya dan juga nama atribut di Intellisense, nice tools :)

great...cool!!

Importing xml namespace

Di VB 9.0 ini kita dapat melakukan Import bukan hanya untuk mereference ke sebuah namespace saja, akan tetapi juga kepada xml namespace yang digunakan di dalam file xml tersebut...xml namespace digunakan untuk menghindari konflik akses nama elemen / atribut yang sama. Misalkan file xml yang digunakan pada contoh artikel ini saya modifikasi dengan menambahkan xml namespace seperti di bawah ini :

   1:  <?xml version="1.0" encoding="utf-8"?>
   2:  <Categories xmlns="http://www.yulianmf.com/XMLSchema1">
   3:    <Category Name="Beverages">

perhatikan kode pada baris ke 2. Pada elemen Categories sekarang terdapat sebuah atribut xmlns yang diisi dengan uri berupa link ke web site saya...xmlns ini sebenarnya tidak harus diisi dengan url yang secara logik harus ada. Kalau anda browse ke url di atas maka tidak akan muncul apa-apa di browsernya :)

Sekarang hapus file .xsd yang sudah dibuat sebelumnya. Tambahkan lagi file xsd baru dengan xml to schema toolsnya. Hal ini dilakukan karena adanya penambahan xmlns pada file xml yang digunakan. Setelah file xsd nya di generate maka dapat anda lihat potongan elemen berikut ini pada file xsd tersebut :

   1:  <?xml version="1.0" encoding="utf-8"?>
   2:  <xs:schema attributeFormDefault="unqualified"
   3:         elementFormDefault="qualified"
   4:         targetNamespace="http://www.yulianmf.com/XMLSchema1"
   5:         xmlns:xs="http://www.w3.org/2001/XMLSchema">

di line-4 ada tambahan atribut targetNamespace yang isi uri nya sama dengan xmlns yang sudah didefinisikan di file xml. Karena struktur file dan schema nya berubah, maka kode yang telah kita buat sebelumnya untuk akses elemen / node tidak dapat dipakai lagi. Sekarang kita harus akses xml node via xmlns yang sudah dibuat. Mari kita lihat modifikasi kode berikut pada gambar dibawah ini :

dengan penggunaan xmlns ini akan terhindar dari konflik akses nama elemen atau atribut yang sama dalam sebuah file xml...ok c u on the next articles :)


[Comments]


[Write your comment]

Name (required)

Email (required-will not published)

Comment
dwep
Input code above below (Case Sensitive) :

ABOUT ME

Rully Yulian MF
Rully Yulian Muhammad Firmansyah | Founder & IT Trainer Native Enterprise | MCT (2008-2019) | MVP (2009-2016) | Xamarin Certified Professional | MTA | MCAD | MCPD | MOS | Bandung, West Java, Indonesia.

[Read More...]

TOP DOWNLOAD

Mapping Hak Akses User Pada MenuStrip Sampai Control Button
downloaded 6983 times

Bagaimana caranya menginstal database ketika deploying sebuah aplikasi?
downloaded 4893 times

Simple Voice Engine Application With Sound Player Class...
downloaded 4045 times

Change Group,Sort Order, Filtering By Date in Crystal Reports
downloaded 3460 times

WinForms DataGrid Paging With SqlDataAdapter
downloaded 2881 times


LINKS

CERTIFICATIONS

Xamarin Certified
MOS 2007
MCT
MCPD
MCTS
MCAD.NET
ASP.NET Brainbench

NATIVE ENTERPRISE

Native Enterprise - IT Training

FOLLOW ME

Youtube  Facebook  Instagram  LinkedIn   Twitter

RSS


NATIVE ENTERPRISE NEWS

© Copyright 2006 - 2024   Rully Yulian MF   All rights reserved.