Pendahuluan

XML (Extensible Markup Language) didefinisikan oleh W3C, diturunkan dari SGML namun lebih sederhana. Dokumen XML memiliki tag yang memberi informasi tambahan tentang bagian dokumen, dan extensible (berbeda dari HTML): pengguna dapat menambahkan tag baru dan menentukan sendiri bagaimana tag tersebut ditangani untuk ditampilkan.

Kemampuan mendefinisikan tag baru dan struktur tag bersarang (nested) menjadikan XML cara yang baik untuk pertukaran data (data exchange), bukan sekadar pengganti HTML — dominan dipakai pada aplikasi pertukaran data antar-organisasi (mis. transfer dana perbankan, pemrosesan order antar-perusahaan, data ilmiah seperti ChemML dan BSML). XML menjadi basis bagi hampir semua format pertukaran data generasi baru.

Perbandingan dengan data relasional: XML kurang efisien karena tag (yang pada dasarnya adalah informasi skema) diulang-ulang di setiap elemen. Namun XML lebih baik sebagai format pertukaran data karena: self-documenting (tag melekat pada data), format tidak kaku (tag dapat ditambahkan), mendukung struktur bersarang, dan diterima luas oleh browser/tools/aplikasi.

Struktur Data XML

Tag: label untuk suatu bagian data. Elemen: bagian data yang diawali <tagname> dan diakhiri </tagname> yang cocok. Elemen harus bersarang dengan benar (properly nested): setiap start tag harus punya end tag unik yang cocok dalam konteks elemen induk yang sama. Setiap dokumen harus memiliki satu elemen tingkat-atas.

<university>
  <department>
    <dept_name>Comp. Sci.</dept_name>
    <building>Taylor</building>
    <budget>100000</budget>
  </department>
  <course>
    <course_id>CS-101</course_id>
    <title>Intro. to Computer Science</title>
    <dept_name>Comp. Sci</dept_name>
    <credits>4</credits>
  </course>
</university>

Motivasi struktur bersarang: berguna untuk pertukaran data (mis. elemen item bersarang di dalam itemlist). Basis data relasional umumnya tidak mendukung/tidak menganjurkan nesting — dengan banyak order, nama & alamat pelanggan disimpan berulang; normalisasi menggantikan struktur bersarang dengan foreign key ke tabel pelanggan terpisah (nesting baru didukung pada basis data object-relational). Namun nesting sesuai untuk transfer data karena aplikasi eksternal tidak memiliki akses langsung ke data yang direferensikan oleh foreign key.

Campuran teks dan sub-elemen (mixed content) diperbolehkan secara sintaksis di XML, berguna untuk document markup tetapi tidak dianjurkan untuk representasi data murni.

Atribut

Elemen dapat memiliki atribut, dituliskan sebagai pasangan name=value di dalam tag pembuka; satu elemen boleh memiliki beberapa atribut tetapi tiap nama atribut hanya boleh muncul sekali:

<course course_id="CS-101" credits="4">

Atribut vs sub-elemen: dalam konteks dokumen, atribut adalah bagian markup sementara isi sub-elemen adalah bagian isi dokumen; dalam konteks representasi data, perbedaan ini kabur — informasi yang sama bisa direpresentasikan sebagai atribut atau sub-elemen. Saran umum: gunakan atribut untuk identifier elemen, dan sub-elemen untuk isi/konten.

Namespace

Karena data XML dipertukarkan antarorganisasi, nama tag yang sama bisa punya makna berbeda pada organisasi berbeda. Solusi: menggunakan XML Namespace — mendeklarasikan prefix unik yang terikat ke URI tertentu (xmlns:prefix="URI"), lalu memakai prefix:elemen untuk menghindari ambiguitas nama tag.

Sintaks Tambahan

  • Elemen tanpa sub-elemen/isi teks dapat disingkat dengan mengakhiri start tag dengan />: <course course_id="CS-101" credits="4" />.
  • CDATA: <![CDATA[<course>...</course>]]> menyimpan string yang mengandung karakter tag tanpa diinterpretasikan sebagai sub-elemen (CDATA = “character data”).

Skema Dokumen XML

Basis data mengharuskan skema untuk membatasi informasi apa yang boleh disimpan; dokumen XML tidak wajib memiliki skema, namun skema sangat penting untuk pertukaran data (tanpa skema, satu pihak tidak dapat mengartikan data dari pihak lain secara otomatis). Dua mekanisme utama: DTD (Document Type Definition) — banyak dipakai, dan XML Schema — lebih baru, makin banyak dipakai.

DTD (Document Type Definition)

DTD membatasi struktur data XML: elemen apa yang boleh muncul, atribut apa yang boleh/harus dimiliki suatu elemen, dan sub-elemen apa yang boleh/harus muncul di dalam suatu elemen (beserta berapa kali). DTD tidak membatasi tipe data (semua nilai direpresentasikan sebagai string di XML).

Spesifikasi elemen — sub-elemen dapat berupa nama elemen lain, #PCDATA (parsed character data — string), EMPTY (tanpa sub-elemen), atau ANY (apa pun boleh jadi sub-elemen):

<!ELEMENT department (dept_name, building, budget)>
<!ELEMENT dept_name (#PCDATA)>

Spesifikasi sub-elemen dapat menggunakan ekspresi reguler: | (alternatif), + (1 atau lebih), * (0 atau lebih):

<!ELEMENT university ((department|course|instructor|teaches)+)>

Spesifikasi atribut — untuk tiap atribut ditentukan nama, tipe (CDATA, atau ID/IDREF/IDREFS untuk referensi), dan apakah wajib (#REQUIRED), punya nilai default, atau opsional (#IMPLIED):

<!ATTLIST course
  course_id   ID      #REQUIRED
  dept_name   IDREF   #REQUIRED
  instructors IDREFS  #IMPLIED >
  • Satu elemen paling banyak memiliki satu atribut bertipe ID; nilai ID harus unik di seluruh dokumen (berfungsi sebagai object identifier).
  • Atribut bertipe IDREF harus berisi nilai ID dari elemen lain di dokumen yang sama; IDREFS berisi himpunan nilai ID (dipisah spasi).

Keterbatasan DTD:

  • Tidak ada tipe data untuk teks/atribut (semua string).
  • Sulit menspesifikasikan himpunan sub-elemen yang tidak berurutan — (A|B)* mengizinkan urutan sembarang tetapi tidak bisa memastikan A dan B masing-masing hanya muncul sekali.
  • ID/IDREF tidak bertipe — atribut instructors pada elemen course secara sintaksis bisa saja merujuk elemen course lain (yang tidak masuk akal), padahal seharusnya hanya boleh merujuk elemen instructor.

XML Schema

Bahasa skema yang lebih canggih, mengatasi kelemahan DTD, mendukung: tipe data (integer, string, dsb, termasuk batas nilai min/max), tipe kompleks (user-defined), serta fitur lanjutan seperti uniqueness dan foreign key constraints dan inheritance. XML Schema sendiri ditulis dalam sintaks XML (lebih standar tetapi lebih verbose dibanding DTD), dan terintegrasi dengan namespace.

Contoh (potongan) definisi elemen department pada XML Schema:

<xs:element name="department">
  <xs:complexType>
    <xs:sequence>
      <xs:element name="dept_name" type="xs:string"/>
      <xs:element name="building" type="xs:string"/>
      <xs:element name="budget" type="xs:decimal"/>
    </xs:sequence>
  </xs:complexType>
</xs:element>

Constraint key (nama departemen sebagai key) dan foreign key (keyref) dapat dinyatakan secara eksplisit:

<xs:key name="deptKey">
  <xs:selector xpath="/university/department"/>
  <xs:field xpath="dept_name"/>
</xs:key>
<xs:keyref name="courseDeptFKey" refer="deptKey">
  <xs:selector xpath="/university/course"/>
  <xs:field xpath="dept_name"/>
</xs:keyref>

Model Pohon (Tree Model) XML

Bahasa query/transformasi XML didasarkan pada model pohon: dokumen XML dimodelkan sebagai pohon dengan node berupa elemen dan atribut. Node elemen memiliki child node (atribut atau sub-elemen); teks di dalam elemen dimodelkan sebagai text node child dari elemen tersebut; urutan child node mengikuti urutan pada dokumen; setiap node (kecuali root) memiliki tepat satu parent (elemen).

Query dan Transformasi

XPath

XPath digunakan untuk menunjuk (select) bagian dokumen menggunakan path expression — rangkaian step dipisah / (mirip nama file pada hierarki direktori), dievaluasi kiri-ke-kanan (tiap step beroperasi pada himpunan hasil step sebelumnya). / di awal menunjuk root dokumen (di atas tag tingkat-atas).

/university-3/instructor/name              -- semua elemen name di dalam instructor
/university-3/instructor/name/text()       -- teks-nya saja (tanpa tag pembungkus)
/university-3/course[credits >= 4]         -- selection predicate dalam []
/university-3/course[credits]              -- elemen course yang punya sub-elemen credits
/university-3/course[credits>=4]/@course_id -- akses atribut dengan "@"

Fungsi XPath: count() menghitung jumlah elemen hasil path; konektif boolean and, or, not(); id() untuk dereference IDREF/IDREFS. Operator | = union hasil dua path (tidak dapat disarangkan di dalam operator lain). // melompati banyak level node (semua descendant); .. menunjuk parent. doc(name) mengembalikan root dari dokumen bernama tertentu.

XSLT

XSL (XML Stylesheet Language) awalnya dirancang untuk menghasilkan HTML dari XML. XSLT adalah bahasa transformasi tujuan umum (XML→XML atau XML→HTML), dengan transformasi dinyatakan sebagai aturan (template) yang menggabungkan seleksi via XPath dengan konstruksi hasil.

XQuery

Bahasa query XML tujuan umum, diturunkan dari bahasa Quilt (meminjam ide dari SQL, XQL, XML-QL). Memakai sintaks FLWOR: for … let … where … order by … return …

XQueryAnalog SQL
forfrom
wherewhere
order byorder by
returnselect
let(tidak ada padanan — variabel sementara)

Contoh — mata kuliah dengan credits > 3:

for $x in /university-3/course
let $courseId := $x/@course_id
where $x/credits > 3
return <course_id> { $courseId } </course_id>

Item pada return diperlakukan sebagai teks XML kecuali diapit {} (dievaluasi sebagai ekspresi).

Join dinyatakan mirip SQL:

for $c in /university/course, $i in /university/instructor, $t in /university/teaches
where $c/course_id = $t/course_id and $t/IID = $i/IID
return <course_instructor> { $c $i } </course_instructor>

Nested query memungkinkan konversi struktur flat menjadi nested (mis. menyisipkan elemen course di dalam department induknya melalui subquery bersarang menggunakan $d/* untuk mengambil semua child suatu elemen).

Grouping & aggregation dilakukan melalui nested query + fungsi agregat (mis. fn:sum(...)), analog GROUP BY pada SQL.

Sorting menggunakan klausa order by (dapat ditambah descending), dan dapat diterapkan di berbagai level nesting sekaligus.

Fungsi user-defined dideklarasikan dengan declare function, dapat memakai tipe dari XML Schema; tanda * (mis. element(course)*) menyatakan urutan nilai. Klausa where mendukung kuantor universal/eksistensial: some $e in path satisfies P dan every $e in path satisfies P (ditambah and fn:exists($e) untuk mencegah path kosong secara vacuously memenuhi every). XQuery juga mendukung klausa if-then-else.

Application Program Interface (API)

Dua API standar untuk mengakses data XML dari program:

  • SAX (Simple API for XML): berbasis model parser — pengguna menyediakan event handler untuk peristiwa parsing (mis. mulai elemen, akhir elemen).
  • DOM (Document Object Model): data XML di-parse menjadi representasi pohon; tersedia berbagai fungsi untuk menelusuri pohon DOM (mis. getParentNode(), getFirstChild(), getNextSibling(), getAttribute(), getElementsByTagName()), serta fungsi untuk memperbarui pohon DOM.

Penyimpanan Data XML

XML dapat disimpan pada: non-relational data store (flat file — natural tetapi tanpa concurrency/recovery; atau XML database khusus — sistem yang dibangun spesifik untuk data XML, mendukung model DOM dan query deklaratif, namun belum ada sistem “commercial-grade” yang matang), atau basis data relasional (data harus diterjemahkan ke bentuk relasional; kelebihan: memanfaatkan DBMS yang sudah matang; kekurangan: overhead translasi data dan query).

Menyimpan XML di Basis Data Relasional

String representation: menyimpan tiap elemen tingkat-atas sebagai field string pada satu tuple (satu relasi untuk semua elemen, atau satu relasi per tipe elemen tingkat-atas). Untuk indexing, nilai sub-elemen/atribut yang perlu diindeks disimpan sebagai kolom tambahan (atau memakai function index jika DBMS mendukung). Kelebihan: dapat menyimpan data XML apa pun bahkan tanpa DTD, cepat diakses per elemen jika ukuran string relatif kecil. Kekurangan: perlu parsing untuk mengakses nilai di dalam elemen (lambat).

Tree representation: model XML sebagai pohon dan simpan memakai relasi nodes(id, parent_id, type, label, value) — tiap elemen/atribut diberi identifier unik, type menandai elemen/atribut, label menyimpan nama tag/atribut, value menyimpan isi teks, opsional atribut position untuk urutan child. Kelebihan: dapat menyimpan data XML apa pun tanpa DTD. Kekurangan: data terpecah menjadi terlalu banyak baris (overhead ruang), dan bahkan query sederhana memerlukan banyak join.

Mapping XML ke relasi (skema diketahui): dibuat relasi untuk tiap tipe elemen dengan skema diketahui — atribut id unik, atribut relasi untuk tiap atribut elemen, atribut parent_id untuk melacak elemen induk. Sub-elemen yang muncul sekali menjadi atribut relasi langsung (untuk sub-elemen kompleks, disimpan id-nya); sub-elemen yang bisa muncul berkali-kali direpresentasikan pada tabel terpisah (analog penanganan multivalued attribute pada ER-to-relational mapping).

Publishing (mengubah data relasional → format XML) dan shredding (mengubah dokumen XML → tuple relasional yang disisipkan) didukung secara otomatis oleh sistem XML-enabled database. Banyak DBMS modern menyediakan tipe data xml native dengan struktur data & indeks internal khusus untuk efisiensi.

SQL/XML

Ekstensi standar SQL untuk menghasilkan output XML bersarang dari query relasional — tiap tuple output dipetakan ke elemen XML <row>. Fungsi utama: xmlelement (membuat elemen), xmlattributes (membuat atribut), xmlagg (membuat forest/kumpulan elemen dari hasil agregasi, sering digabung dengan GROUP BY):

select xmlelement(name "department", dept_name,
       xmlagg(xmlforest(course_id) order by course_id))
from course
group by dept_name

Aplikasi XML

  • Penyimpanan/pertukaran data terstruktur kompleks: mis. ODF (Open Document Format) untuk OpenOffice, OOXML (Office Open XML) untuk Microsoft Office, ChemML, MathML.
  • Pertukaran data untuk Web Services: standar SOAP (Simple Object Access Protocol) memungkinkan pemanggilan prosedur lintas aplikasi dengan basis data berbeda, menggunakan XML untuk merepresentasikan input/output prosedur. Sebuah Web service adalah situs yang menyediakan kumpulan prosedur SOAP, dideskripsikan menggunakan WSDL (Web Services Description Language); direktori Web service dideskripsikan dengan standar UDDI (Universal Description, Discovery, and Integration).
  • Data mediation: format representasi data bersama untuk menjembatani sistem yang berbeda.

Sumber

  • Silberschatz, Korth, Sudarshan: “Database System Concepts”, 6th edition, Chapter 23.

Flashcard

flashcards Kenapa XML lebih baik sebagai format pertukaran data dibanding tuple relasional? :: XML self-documenting (tag melekat pada data), format tidak kaku (tag bisa ditambah), mendukung struktur bersarang, dan diterima luas oleh browser/tools/aplikasi. Apa syarat elemen XML “properly nested”? :: Setiap start tag harus punya end tag unik yang cocok dalam konteks elemen induk yang sama (tidak boleh tumpang tindih). Kapan sebaiknya memakai atribut vs sub-elemen dalam representasi data XML? :: Gunakan atribut untuk identifier elemen, dan sub-elemen untuk isi/konten (meski batasannya kabur untuk representasi data). Apa fungsi ID dan IDREF pada DTD? :: ID = atribut identifier unik pada satu elemen (paling banyak satu per elemen, unik se-dokumen); IDREF = atribut yang berisi nilai ID elemen lain (referensi), IDREFS untuk banyak referensi. Sebutkan dua keterbatasan utama DTD dibanding XML Schema :: (1) Tidak ada tipe data untuk nilai (semua string), sulit menspesifikasikan himpunan sub-elemen tak-berurutan; (2) ID/IDREF tidak bertipe sehingga tidak bisa dibatasi harus merujuk ke tipe elemen tertentu. Apa arti sintaks FLWOR pada XQuery dan padanannya di SQL? :: for≈from, where≈where, order by≈order by, return≈select; let adalah variabel sementara tanpa padanan SQL. Apa perbedaan SAX dan DOM sebagai API akses XML? :: SAX berbasis event parsing (event handler untuk start/end elemen); DOM mem-parse seluruh dokumen menjadi struktur pohon yang dapat ditelusuri dan diubah. Sebutkan tiga cara menyimpan XML di basis data relasional :: String representation (elemen sebagai field string), tree representation (relasi nodes(id,parent_id,type,label,value)), dan mapping ke relasi sesuai skema yang diketahui (publishing/shredding). Apa itu SOAP, WSDL, dan UDDI? :: SOAP = protokol pemanggilan prosedur lintas aplikasi berbasis XML; WSDL = bahasa mendeskripsikan Web service (kumpulan prosedur SOAP); UDDI = standar direktori untuk menemukan Web service.