Pages

Wednesday, October 3, 2012

XML, DOM & SAX


DOM
Document Object Model atau DOM adalah Platform atau anatarmuka bahasa netral yang menyediakan model standar bagaimana objek dalam suatu objek XML diletakkan bersama-sama dan interface standar untuk mengakses dan memanipulasi objek-objek dan berhubungan dengan mereka.
DOM adalah antarmuka yang mengekspos dokumen XML sebagai struktur pohon yang terdiri dari node. DOM memungkinkan kita untuk menavigasi pohon dan menambah, mengubah dan menghapus setiap elemen. Standar pemograman antarmuka DOM didefinisikan oleh World Wide Web Consortium(W3C).
Untuk dapat menggunakan fitur-fitur XML, DOM menggunakan parser DOM-enabled, misalnya JAXP. Parser DOMenabled membaca dokumen XML, menelusurinya, meyakinkan bahwa ia valid. Kemudian, ia membuat representasi memori dalam struktur data tree. Struktur tree terbuat dari node-node. Anda dapat menggunakan object-object DOM yang disediakan parser DOM-enabled untuk memanipulasi node-node ini.
DOM juga mendefinisikan sejumlah subinterfaces ke interface Node:
Element: Represents an XML element in the source document.

Attr: Represents an attribute of an XML element.

Text: The content of an element. This means that an element with text
contains text node children; the text of the element is not a property of the
element itself.

Document: Represents the entire XML document. Exactly one Document
object exists for each XML document you parse. Given a Document
object, you can find the root of the DOM tree; from the root, you can use DOM functions to read and manipulate the tree.

Method yang umum digunakan di DOM

Ketika kita bekerja dengan DOM, kita akan sering menggunakan metode berikut:

Document.getDocumentElement(): Returns the root of the DOM
tree. (This function is a method of the Document interface; it isn't defined
for other subtypes of Node. )

Node.getFirstChild() and Node.getLastChild(): Return the first
or last child of a given Node.

Node.getNextSibling() and Node.getPreviousSibling():
Return the next or previous sibling of a given Node.

Element.getAttribute(String attrName): For a given Element,
return the value of the attribute named attrName. If you want the value
of the "id" attribute, use Element.getAttribute("id"). If that
attribute doesn't exist, the method returns an empty string ( "" ).

contoh membuat xml dengan DOM menggunakan JAPX:

import org.w3c.dom.*;
import javax.xml.parsers.*; 
import javax.xml.transform.*; 
import javax.xml.transform.dom.DOMSource; 
import javax.xml.transform.stream.StreamResult; 

class CreateDomXml 
{
  public static void main(String[] args) 
  {
    try{
    //Create instance of DocumentBuilderFactory
    DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
    //Get the DocumentBuilder
    DocumentBuilder docBuilder = factory.newDocumentBuilder();
    //Create blank DOM Document
        Document doc = docBuilder.newDocument();

    //create the root element
        Element root = doc.createElement("bukudetails");
    //all it to the xml tree
        doc.appendChild(root);
    
      //create a comment
      Comment comment = doc.createComment("This is comment");
      //add in the root element
      root.appendChild(comment);

    //create child element
    Element childElement = doc.createElement("buku");
    //Add the atribute to the child
    childElement.setAttribute("ID_BUKU","CM107");
    root.appendChild(childElement);
    
    TransformerFactory tranFactory = TransformerFactory.newInstance(); 
    Transformer aTransformer = tranFactory.newTransformer(); 

    Source src = new DOMSource(doc); 
    Result dest = new StreamResult(System.out); 
    aTransformer.transform(src, dest); 

    }catch(Exception e){
      System.out.println(e.getMessage());
    }
  }
}


XML yang Terbentuk adalah

<?xml version="1.0" encoding="UTF-8" ?> 
<bukudetails>
<!-- 
This is comment--> 
<
buku id_buku="CM107" /> 
</
bukudetails>

SAX

Simple API for XML (SAX) dibuat oleh David Megginson dan bersifat open source. Versi awal SAX dibuat untuk Java, tetapi versi SAX2, juga mendukung VB 6.0 dan VB.NET. SAX API digunakan untuk memproses dokumen XML.

Software yang menggunakan SAX untuk memproses dokumen XML disebut SAX parser. SAX parser tidak mengambil seluruh dokumen XML dalam memori, tetapi hanya yang dibutuhkan saja. SAX parser adalah parser event-driven yang membaca data di dokumen XML berurutan dari awal hingga akhir. SAX API cocok untuk memproses dokumen XML yang besar karena menggunakan sedikit memori.

            SAX menggunakan class dan interface SAX API untuk memproses dokumen XML. SAX memiliki beragam event listener yang memberitahu parser SAX tentang beragam kejadian di dokumen, apakah “start document”, “end document”, “start tag”, “end tag”, atau lainnya. SAX parser memberitahu aplikasi SAX setiap kali ia mendapatkan event tersebut. Pemberitahuan dikerjakan dengan method callback: startDocument(), characters(), endDocument(). Method-method ini didefinisikan oleh handler interfaces, semisal ContentHandler, DTDHandler, ErrorHandler, dan EntityResolver

Handler interface mendefinisikan method untuk setiap event. Lakukan implements handler interfaces dalam aplikasi SAX dan override method callback untuk menerima pemberitahuan event penelusuran. Sebagai contoh, parser SAX memanggil method startElement() ketika ia menemukan <, memanggil endElement() ketika menemukan </. Apa yang akan dilakukan ketika menemukan <, perlu dituliskan dalam method startElement().

SAX API

SAX API terdiri dari beragam paket yang digunakan untuk menelusuri dokumen XML. Paket org.xml.sax berisi interface dasar SAX API. Handler interface inti dari paket ini adalah:

- ContentHandler
- ErrorHandler
- DTDHandler
- EntityResolver

Contoh cara menampilkan file XML dengan menggunakan java sax

Employee-Detail.xml

<?xml version = "1.0" ?>
<Employee-Detail>

<Employee>
<Emp_Id> E-001 </Emp_Id>
<Emp_Name> Vinod </Emp_Name>
<Emp_E-mail> Vinod1@yahoo.com </Emp_E-mail>
</Employee>

<Employee>
<Emp_Id> E-002 </Emp_Id>
<Emp_Name> Amit </Emp_Name>
<Emp_E-mail> Amit2@yahoo.com </Emp_E-mail>
</Employee>

<Employee>
<Emp_Id> E-003 </Emp_Id>
<Emp_Name> Deepak </Emp_Name>
<Emp_E-mail> Deepak3@yahoo.com </Emp_E-mail>
</Employee>
</Employee-Detail>

EmployeeDetails.java

import javax.xml.parsers.*;
import org.xml.sax.*;
import org.xml.sax.helpers.*;
import java.io.*;

public class EmployeeDetails{
  public static void main(String[] args) throws IOException{
    BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
    System.out.print("Enter XML file name:");
    String xmlFile = bf.readLine();
    EmployeeDetails detail = new EmployeeDetails(xmlFile);
  }
  public EmployeeDetails(String str){
    try{
      File file = new File(str);
      if (file.exists()){
        SAXParserFactory parserFact = SAXParserFactory.newInstance();
        SAXParser parser = parserFact.newSAXParser();
        System.out.println("XML Data: ");
        DefaultHandler dHandler = new DefaultHandler(){
          
          boolean id;
          boolean name;
          boolean mail;
          
          public void startElement(String uri, String localName, 
           String element_name, Attributes attributes)
throws SAXException{
            if (element_name.equals("Emp_Id")){
              id = true;
            }
            if (element_name.equals("Emp_Name")){
              name = true;
            }
            if (element_name.equals("Emp_E-mail")){
              mail = true;
            }
          }
          
          public void characters(char[] ch, int start, int len) throws SAXException{
            String str = new String (ch, start, len);
            if (id){
              System.out.println("Emp_Id: "+str);
              id = false;
            }
            if (name){
              System.out.println("Name:   "+str);
              name = false;
            }
            if (mail){
              System.out.println("E-mail: "+str);
              mail = false;
            }
          }
        };
        
        parser.parse(str, dHandler);
      }
      else{
        System.out.println("File not found!");
      }
    }
    catch (Exception e){
      System.out.println("XML File hasn't any elements");
      e.printStackTrace();
    }
  }
}


Perbandingan antara DOM dan SAX

SAX berbeda dengan DOM dalam hal : Kriteria
DOM
SAX
Cara penelusuran
DOM membaca keseluruhan
SAX membaca satu per satu komponen XML
Organisasi informasi
DOM menggunakan struktur tree
SAX bukan tree
Akses informasi
dalam DOM dilakukan dengan penelusuran pohon
dalam SAX sekuensial
Kecepatan
DOM me-load semua data XML. Jika dokumen besar, akan lambat.
untuk browse SAX lebih bagus
kompleksitas pengembangan
Sudah disedikana object berikut property dan methodnya
Di SAX harus meng-override method terkait.
penggunaan memori
DOM butuh memori untuk menyimpan tree
SAX tidak
kemampuan navigasi
Setelah tersimpan di memori, tree DOM dapat diakses bebas
dalam SAX jika ingin mengulang, selalu dari awal lagi
kemudahan transformasi
dalam DOM isi dokumen XML dapat diubah
dalam SAX dokumen XML hanya untuk dibaca


DAFTAR PUSTAKA

Kusmayadi Hendra, Eko Darwiyanto, “XML dan WEB SERVICE”, Politeknik Telkom,2009.



Doug Tidwell, “XML Programing in Java Technology, Part 1”, IBM, 13 Januari 2004.