Sử dụng SAX làm việc với XML trong Java

thongdoanvan

Moderator
21/1/10
247
7
16
Mình định viết một loạt bài về cách làm việc với tài liệu XML trong java, mong được anh em giúp đỡ và góp ý.

Ý nghĩa của XML?
Chuẩn XML ngày cảng được ứng dụng rộng rãi, Mặc dù chỉ là một file Text. Nhưng XML có cấu chúc rất chặt chẽ. Nó được ví như một cơ sở dữ liệu thu nhỏ. Có thể mang đi nơi khác dễ dàng, không cần phải cấu hình.
Vì vậy chúng ta hoàn toàn có thể dùng XML để làm một ứng dụng Java Application, với ưu điểm đặc biệt là: Không cần phải cấu hình khi ta mang đi máy khác.
+Ngoài ra: XMl có một vai tro vô cùng quan trọng, đó là làm cầu nối trung gian giao tiếp giữa các ngôn ngữ lập trình.
-Nếu chúng ta có các bảng trong SqlServer. Rồi chúng ta dùng Java xuất nó ra file XML. Sau đó dùng file XML này đưa cho Cshap sử lý. Thì nó hoàn toàn có thể hiểu được file XML.
Ở đây chúng ta sẽ nghiên cứu về cách làm việc của XML trong Java?
PHP:
Bài 1: Các kỹ thuật để Parser một tài liệu XML trong Java
Trong java có hai kỹ thuật chính dùng để parser XML đó là
-Phân tích theo hướng sự kiện(Event): Mà tiêu biểu là dùng Sax,-->Do sun đưa ra
-Phân tích theo hướng đối tượng(Object):Mà tiêu biểu là dùng Dom-->Do tổ chức W3C đưa ra.
Trong các ngôn ngữ khác như Cshap, hoặc Javascript, thì người ta chỉ sử dụng theo mô hình hướng đối tượng. Còn trong java ta có thể làm theo cả hướng sự kiện, và hướng đối tượng. Mỗi một mô hình phân tích, đều có ưu nhược điểm riêng, trước tiên ta tìm hiểu mô hình phân tích hướng sự kiện.
1. Phân tích theo mô hình hướng sự kiện.
Ví dụ đối với tài liệu xml sau.
Code:
<?xml version="1.0" encoding="utf-8" ?>
<StudentList>
  <Student StudentID="S01" Gender="Male"  >
    <Name>Nguyen Van Tuyen</Name>
    <Age>23</Age>
  </Student>
  <Student StudentID="S02" Gender="FeMale" >
    <Name>Kieu Thi Nga </Name>
    <Age>20</Age>
  </Student>
  <Student StudentID="S03" Gender="FeMale" >
    <Name>Nguyen Thi Hoa </Name>
    <Age>21</Age>
  </Student>
</StudentList>
-Theo mô hình hướng sự kiện, thì nó sẽ tiến hành tìm sự kiện. Đầu tiên nó sẽ tìm tới nơi bắt đầu tài liệu XML
<?xml version="1.0" encoding="utf-8" ?>
Đây là nơi bắt đầu của một tài liệu XML
--Sau khi nó đã nhận biết được đâu là nơi bắt đầu tài liệu XML, nó tiếp tục vào phân tích các thành phần của tài liệu: đây là nút gốc( Document Element).
<StudentList>Đây là nút gốc
Nút gốc sẽ chứa tất cả các Element khác trong tài liệu XML
Tiếp tới nó sẽ phân tích tới :Đây là element đầu tiên của tài liệu xml.
<Student StudentID="S01" Gender="Male>
Đồng thời lúc này Element này sẽ được load lên bộ nhớ.
Trong element này lại có các trường :
<Name>Nguyen Van Tuyen</Name>
<Age>23</Age>
Sau khi nhận biết được thẻ đóng . Báo hiệu kết thúc Element đầu tiên. Tiếp theo nó sẽ phân tích tiếp các Element tiếp theo. Cho đến khi gặp thẻ đóng
</StudentList>
Tóm lại: Thay vì load toàn bộ tài liệu XML lên bộ nhớ, thì mô hình hướng sự kiện, sẽ phân tích và load từng Element lên bộ nhớ. Vì vậy cách phân tích này hay còn gọi là phân tích tuần tự.
Vậy thì nó có những ưu nhược điểm gì?
--Chủ yếu dùng để đọc tài liệu XML là chính
Nhược điểm: Quá trình phân tích đi theo một chiều, từ trên xuống. Không hỗ trợ cơ chế đi lại trong quá trình phân tích, Do đó nếu chúng ta thực hiện việc tìm kiếm trên tài liệu XML sẽ rất khó.
Ưu điểm: Gỉa sử chúng ta có một tài liệu XML tầm 700-800mb, nếu chúng ta load toàn bộ lên bộ nhớ thì không ổn. Tuy nhiên nếu chúng ta load từng phần lên, theo cách làm việc của Sax thì lại được. Đây cũng là ưu điểm của Sax.
Trước tiên chúng ta cần phải tìm hiểu cấu trúc của tài liệu XML, các bạn vô đây để tìm hiểu được kỹ:
http://www.w3schools.com/xml/default.asp
 

thongdoanvan

Moderator
21/1/10
247
7
16
Ðề: Làm việc XML Trong Java

PHP:
Bài 2 Phân tích tài liệu XML sử dụng kỹ thuật SAX
Ở bài trước mình đã giải thích cách SAX phân tích một tài liệu XML.
Bài này mình sẽ nêu một ví dụ cụ thể: Ví dụ này đếm tổng số sinh viên trong tài liệu XML.
Ví dụ phân tích tài liệu XML bằng kỹ thuật Sax
Sử dụng netbean.
PHP:
Bước 1:Tạo một  Project: xmlwithjava
Bước 2: Tạo một package:lab1
Bước 3:Tạo một tài liệu xml:one.xml
<?xml version="1.0" encoding="UTF-8"?>
<StudentList>
    <student studentId="s01" gender="male">
        <name>Nguyen quan tuyen</name>
        <age>25</age>
    </student>
    <student studentId="s02" gender="female">
        <name>Nguyen Thi Hoa</name>
        <age>30</age>
    </student>
    <student studentId="s03" gender="female">
        <name>Nguyen Thi Hoa Huong</name>
        <age>35</age>
    </student>
</StudentList>
Bước 4: Tạo một Class sử lý có tên là: saxprocess.java
package lab1;
import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;
public class saxprocess extends DefaultHandler {
    private int count;
    public saxprocess() {
        count=0;
    }
    @Override
    //moi khi co mot Element
    public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
       if(qName.equals("student"))
       {
           count++;//dem so sinh vien
       }
    }
    @Override
    public void endDocument() throws SAXException {
        System.out.println("Co"+count+"Trong danh sach");
    }
}
Trong quá trình phân tích bằng kỹ thuật Sax. Cụ thể là trong lớp saxprocess. Sẽ có 4 sự kiện chính. Đó là startDocument(), startElement(),characters(), endDocument().
+ Với ví dụ trên có 2 sự kiện chính là
-startElement():Sự kiện này sẽ phát sinh khi bắt đầu một Element. 
       if(qName.equals("student"))
       {
           count++;//dem so sinh vien
       }
Mỗi khi tìm thấy một Element có name là Student thì tăng biến đếm lên 1.
-endDocument():Báo hiệu kết thúc tài liệu XML
Trong sự kiện này sẽ tổng kết số sinh viên trong danh sách XML
System.out.println("Co"+count+"Trong danh sach");
Bước 5:Tạo một lớp để test ứng dụng: test.java
package lab1;
import java.io.File;
import java.io.IOException;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;
import org.xml.sax.SAXException;
public class test  {
    public static void main(String[] args) throws IOException
    {
        saxprocess sax=new saxprocess();//tao mot doi tuong cua saxprocess.
        String path="src\\lab1\\one.xml";
        SAXParserFactory saxpaser=SAXParserFactory.newInstance();
        try {
            SAXParser parser = saxpaser.newSAXParser();
            File F=new File(path);
            parser.parse(F, sax);
        } catch (ParserConfigurationException ex) {
            Logger.getLogger(test.class.getName()).log(Level.SEVERE, null, ex);
        } catch (SAXException ex) {
            Logger.getLogger(test.class.getName()).log(Level.SEVERE, null, ex);
        } 
    } 
}
Note:
String path="src\\lab1\\one.xml"; //Đường dẫn của file xml
File F=new File(path); Cần import gói java.io
 parser.parse(F, sax);Parser tài liệu xml với đường dẫn f, parser trong lớp saxprocess
Trong ví dụ này, chúng ta có sử dụng đến cái API đó là
SAXParserFactory, SAXParser.
Các bạn có thể tìm hiểu thêm về các lớp trên ở địa chỉ sau:
http://java.sun.com/j2se/1.5.0/docs/api/javax/xml/parsers/SAXParserFactory.html
http://java.sun.com/j2se/1.4.2/docs/api/javax/xml/parsers/SAXParser.html
 

thongdoanvan

Moderator
21/1/10
247
7
16
Ðề: Làm việc XML Trong Java

PHP:
Ví dụ 2:
Các bước hoàn toàn giống ví dụ 1
Cũng với file xml như ví dụ 1. Chỉ khác ở file saxprocess.java
PHP:
package lab2;
import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;
public class saxprocess extends DefaultHandler {
    boolean ageFound;
    boolean nameFound;
    @Override
    public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
        if(qName.equals("name"))
        {
            nameFound=true;
        }
        if(qName.equals("age"))
        {
            ageFound=true;
        }
    }
    @Override
    public void characters(char[] ch, int start, int length) throws SAXException {
        String str=new String(ch,start,length);
        str=str.trim();
        if(nameFound)
        {
            System.out.println("\t Name:"+str);
            nameFound=false;//ket thuc mot element;
        }
        if(ageFound)
        {
            System.out.println("\t Age:"+str);
            ageFound=false;
        }
    }
Trong ví dụ này, chúng ta sẽ lấy name, và age. Chính vì thế cần phải khai báo hai biến là nameFound, và ageFound.
Trong sự kiện start Element, mỗi khi tìm thấy name, age. Thì nó sẽ gán nameFound, ageFound=true.
Trong sự kiện character ta sẽ lấy được nội dung của name, age. Đồng thời phải tiến hành gán nameFound, ageFound=false. Mục đích gán để khi đến Element khác cũng có name, age thì có thể phân biệt và lấy dự liệu được.
 

thongdoanvan

Moderator
21/1/10
247
7
16
Ðề: Làm việc XML Trong Java

Ví dụ này sẽ giúp ta lấy các Attribute của các element
PHP:
<?xml version="1.0" encoding="utf-8" ?>
<StudentList>
  <Student StudentID="S01" Gender="Male"  >
    <Name>Nguyen Van Tuyen</Name>
    <Age>23</Age>
  </Student>
  <Student StudentID="S02" Gender="FeMale" >
    <Name>Kieu Thi Nga </Name>
    <Age>20</Age>
  </Student>
  <Student StudentID="S03" Gender="FeMale" >
    <Name>Nguyen Thi Hoa </Name>
    <Age>21</Age>
  </Student>
</StudentList>
Cụ thể với tài liệu xml trên, ta cần lấy StudentId, và Gender
Trong ví dụ này, các bước hoàn toàn tương tự ví dụ 1. Chỉ khác ở file saxprocess.java
Các bạn xem ví dụ 1 ở đây:
http://congdongjava.com/showthread.php?p=970#post970
Sau đây là nội dung của File này
PHP:
package lab3;
import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;
public class saxprocess extends DefaultHandler {
    @Override
    public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
        if(qName.equals("student"))
        {
            String studentId=attributes.getValue("studentId");
            System.out.println("StudentId:"+studentId);
        }
    }
}
Ví dụ 3: Ví dụ này sẽ giúp ta lấy được Attributes của
<student studentId="s01" gender="male">àTrong ví dụ trước ta chưa làm được điều này
Mà cụ thể ở đây, chúng ta: String studentId=attributes.getValue("studentId"); sẽ lấy được các StudentId
 

thongdoanvan

Moderator
21/1/10
247
7
16
Ðề: Làm việc XML Trong Java

Ví dụ 4: Sử dụng mô hình Sax
Khi làm việc với tài liệu XML bằng kỹ thuật Sax, chúng ta thường sử dụng 4 sự kiện chính
Đó là
-startDocument():Báo hiệu bắt đầu một Tài liệu XML
- startElement():Báo hiệu bắt đầu một thẻ XML
- character():Sự kiện này giúp ta lấy nội dung của thẻ
- endDocument():Báo hiệu kết thúc một tài liệu XML
Các bước làm hoàn toàn tương tự vídụ1,2,3.
Xem thêm ở đây:http://congdongjava.com/showthread.php?t=470
Chỉ khác ở lớp process.java. Nội dung của lớp này như sau
PHP:
package lab4;
import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;
public class saxprocess extends DefaultHandler {
    int count;
    String student;
    public saxprocess()
     {
         count=0;
     }
    @Override
    public void startDocument() throws SAXException {
        System.out.println("Bat dau cua tai lieu XML");
    } 
    @Override
    public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
       if(qName.equals("student"))
       {
           count++;
           String studentId=attributes.getValue("studentId");
           student="StudentId:"+studentId;
       }
        if(qName.equals("name"))
       {
           student=student+"Name:";
       }
       if(qName.equals("age"))
       {
           student=student+"Age:";
       } 
    }
    @Override
    public void characters(char[] ch, int start, int length) throws SAXException {
        String str=new String(ch,start,length);
        if(!str.equals(""))
        {
            student=student+str;
        }
        System.out.println(student);
    }
    @Override
    public void endDocument() throws SAXException {
        System.out.println("Son sinh vien la:"+count);
    }  
}
Đây là ví dụ tổng hợp. Trong ví dụ này, chúng ta sử dụng cả 4 kỹ thuật để phân tích tài liệu XML với 4 sự kiện chính
-         startDocument()
-         startElement()
-         character()
-         endDocument()
Đồng thời với việc lấy nội dung của các element, chúng ta còn có thể lấy được các attribute.
 

nghiencuuJava

Member
18/3/10
216
0
16
Ðề: Làm việc XML Trong Java

Bạn thongdoanvan cho mình hỏi mình có coding như sau để tạo file xml mới và sau đó sẽ lưu thêm các node vào :

Code:
import java.io.IOException;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.xml.parsers.*;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Text;
import org.xml.sax.InputSource;
import java.io.StringReader;
import java.io.StringWriter;

import javax.xml.transform.OutputKeys;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerException;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;
import org.xml.sax.SAXException;

 try
  {
        File file = new File("D:/abc.xml");

        if(!file.isDirectory() && !file.exists())
      {

        DocumentBuilderFactory builderFactory = DocumentBuilderFactory.newInstance();
        DocumentBuilder docBuilder = builderFactory.newDocumentBuilder();
        //creating a new instance of a DOM to build a DOM tree.
        Document doc = docBuilder.newDocument();

        //This method creates an element node
        Element root = doc.createElement("Person");
        //adding a node after the last child node of the specified node.
        doc.appendChild(root);

        Element rootE=doc.createElement("User");
        root.appendChild(rootE);

        Element child1 = doc.createElement("UserName");
        rootE.appendChild(child1);

        Text text1 = doc.createTextNode(username);
        child1.appendChild(text1);


        Element child2 = doc.createElement("Password");
        rootE.appendChild(child2);

        Text text2 = doc.createTextNode(password);
        child2.appendChild(text2);

        Element child3 = doc.createElement("Role");
        rootE.appendChild(child3);

        Text text3 = doc.createTextNode(role);
        child3.appendChild(text3);

     //TransformerFactory instance is used to create Transformer objects.
        TransformerFactory factory = TransformerFactory.newInstance();
        Transformer transformer = factory.newTransformer();

        transformer.setOutputProperty(OutputKeys.INDENT, "yes");

        // create string from xml tree
        StringWriter sw = new StringWriter();
        StreamResult result = new StreamResult(sw);
        DOMSource source = new DOMSource(doc);
        transformer.transform(source, result);
        String xmlString = sw.toString();


        BufferedWriter bw = new BufferedWriter
                      (new OutputStreamWriter(new FileOutputStream(file)));
        bw.write(xmlString);
        bw.flush();
        bw.close();

        out.println("<script type=\"text/javascript\">");
        out.println("alert('Insert sucessful');");
        out.println("</script>");


      }
      else{

 Document doc =DocumentBuilderFactory.newInstance().newDocumentBuilder().parse(new InputSource(new FileReader(file)));
              
         
         Element root=doc.getDocumentElement();
         Element child=(Element)root.getFirstChild();

     
        Element rootE=(Element)child.cloneNode(true);
        root.appendChild(rootE);


        Element child1 = doc.createElement("UserName");
        rootE.appendChild(child1);

        Text text1 = doc.createTextNode(username);
        child1.appendChild(text1);


        Element child2 = doc.createElement("Password");
        rootE.appendChild(child2);

        Text text2 = doc.createTextNode(password);
        child2.appendChild(text2);

        Element child3 = doc.createElement("Role");
        rootE.appendChild(child3);

        Text text3 = doc.createTextNode(role);
        child3.appendChild(text3);

     //TransformerFactory instance is used to create Transformer objects.
        TransformerFactory factory = TransformerFactory.newInstance();
        Transformer transformer;
        StringWriter sw = new StringWriter();
        transformer  = factory.newTransformer();

        transformer.setOutputProperty(OutputKeys.INDENT, "yes");

        // create string from xml tree

        StreamResult result = new StreamResult(sw);
        DOMSource source = new DOMSource(doc);
        transformer.transform(source, result);
      
        out.println("<script type=\"text/javascript\">");
        out.println("alert('Insert sucessful');");
        out.println("</script>");
    }//end else


  }
  catch(Exception e)
  {
    out.println(e);
  }
Nhưng khi chạy lần đầu tiên thì ok , chạy lần sau thì lại gặp lỗi này :

java.lang.ClassCastException: com.sun.org.apache.xerces.internal.dom.DeferredTex tImpl cannot be cast to org.w3c.dom.Element

Sao nó lại báo ko ép kiểu được nhỉ? Muốn khắc chế nó thì fai thay đổi ở chỗ nào bạn hướng dẫn cho mình với. Chân thành cám ơn bạn.
 

tranhuyvc

Administrator
Staff member
21/1/10
6,248
231
63
Ðề: Làm việc XML Trong Java

Bị lỗi ở dòng nào vậy bạn, copy chi tiết lỗi xem, bạn k có file XML nên mình k thể run thử kiểm tra cho bạn được
 

geminious

Member
8/12/10
142
6
16
Hà Nội
Ðề: Làm việc XML Trong Java

bài này là dùng XML qua SAX, còn cách làm việc qua DOM thì sao :-? admin làm bài nữa đi ;))
 

mrviit

New Member
31/3/11
3
0
0
Ðề: Sử dụng SAX làm việc với XML trong Java

Bài này hay quá, viết rất dễ hiểu. Thanks chủ topic.
Mình cũng đang tìm hiểu về xml trong java.
Mới viết đc cái class generate TreeModel from XML file.
Để mình chỉnh sửa lại rồi sẽ up lên diễn đàn.
 

dương vũ

New Member
29/6/12
1
0
1
31
Ðề: Làm việc XML Trong Java

Ví dụ 4: Sử dụng mô hình Sax
Khi làm việc với tài liệu XML bằng kỹ thuật Sax, chúng ta thường sử dụng 4 sự kiện chính
Đó là
-startDocument():Báo hiệu bắt đầu một Tài liệu XML
- startElement():Báo hiệu bắt đầu một thẻ XML
- character():Sự kiện này giúp ta lấy nội dung của thẻ
- endDocument():Báo hiệu kết thúc một tài liệu XML
Các bước làm hoàn toàn tương tự vídụ1,2,3.
Xem thêm ở đây:http://congdongjava.com/showthread.php?t=470
Chỉ khác ở lớp process.java. Nội dung của lớp này như sau
PHP:
package lab4;
import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;
public class saxprocess extends DefaultHandler {
    int count;
    String student;
    public saxprocess()
    {
        count=0;
    }
    @Override
    public void startDocument() throws SAXException {
        System.out.println("Bat dau cua tai lieu XML");
    }
    @Override
    public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
      if(qName.equals("student"))
      {
          count++;
          String studentId=attributes.getValue("studentId");
          student="StudentId:"+studentId;
      }
        if(qName.equals("name"))
      {
          student=student+"Name:";
      }
      if(qName.equals("age"))
      {
          student=student+"Age:";
      }
    }
    @Override
    public void characters(char[] ch, int start, int length) throws SAXException {
        String str=new String(ch,start,length);
        if(!str.equals(""))
        {
            student=student+str;
        }
        System.out.println(student);
    }
    @Override
    public void endDocument() throws SAXException {
        System.out.println("Son sinh vien la:"+count);
    }
}
Đây là ví dụ tổng hợp. Trong ví dụ này, chúng ta sử dụng cả 4 kỹ thuật để phân tích tài liệu XML với 4 sự kiện chính
-        startDocument()
-        startElement()
-        character()
-        endDocument()
Đồng thời với việc lấy nội dung của các element, chúng ta còn có thể lấy được các attribute.
anh ơi cho hỏi là nếu mình mún lấy thông tin của người mang mã số "S03" thôi thì mình phải làm sao nhỉ?
 
10/4/13
2
0
1
29
anh ơi cho hỏi là nếu mình mún lấy thông tin của người mang mã số "S03" thôi thì mình phải làm sao nhỉ?
Bạn có thể làm như thế này
HTML:
package main;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;

public class SAX extends DefaultHandler{

    private int count;
    public SAX() {
        // TODO Auto-generated constructor stub
        count=0;
    }
    String student;
    boolean isAge;
    boolean isName;
    boolean test;
    @Override
    public void startDocument() throws SAXException {
        // TODO Auto-generated method stub

        System.out.println("MSSV\tHo ten sinh vien\tTuoi");
    }
    @Override
    public void startElement(String uri, String localName, String qName,
            org.xml.sax.Attributes attributes) throws SAXException {
        // TODO Auto-generated method stub
        super.startElement(uri, localName, qName, attributes);
        if(qName.equals("Student"))
        {
            count++;
            String idStud= attributes.getValue("StudentID");
            if(idStud.equals("S01"))
            {
                student= idStud;
                test=true;
            }
            else
                student="";
        }
        if(qName.equals("Age"))
            isAge=true;
        if(qName.equals("Name"))
            isName=true;
    }
    @Override
    public void characters(char[] ch, int start, int length)
            throws SAXException {
        // TODO Auto-generated method stub
        String str= new String(ch,start,length);
        if(test)
        {
            if(isName)
            {
                student+="\t"+str;
                isName=false;
            }
            if(isAge)
            {
                student+="\t"+str;
                isAge=false;
                System.out.println(student);
                test=false;
                System.out.println('a'+7);
            }

        }
 
    }
    @Override
    public void endDocument() throws SAXException {
        // TODO Auto-generated method stub
        System.out.println("Có "+count+" trong danh sách");

    }
}
 
10/4/13
2
0
1
29
Cảm ơn chủ topic nha bài viết rất hay.
Ðề: Làm việc XML Trong Java

Ví dụ 4: Sử dụng mô hình Sax
Khi làm việc với tài liệu XML bằng kỹ thuật Sax, chúng ta thường sử dụng 4 sự kiện chính
Đó là
-startDocument():Báo hiệu bắt đầu một Tài liệu XML
- startElement():Báo hiệu bắt đầu một thẻ XML
- character():Sự kiện này giúp ta lấy nội dung của thẻ
- endDocument():Báo hiệu kết thúc một tài liệu XML
Các bước làm hoàn toàn tương tự vídụ1,2,3.
Xem thêm ở đây:http://congdongjava.com/showthread.php?t=470
Chỉ khác ở lớp process.java. Nội dung của lớp này như sau
PHP:
package lab4;
import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;
public class saxprocess extends DefaultHandler {
    int count;
    String student;
    public saxprocess()
    {
        count=0;
    }
    @Override
    public void startDocument() throws SAXException {
        System.out.println("Bat dau cua tai lieu XML");
    }
    @Override
    public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
      if(qName.equals("student"))
      {
          count++;
          String studentId=attributes.getValue("studentId");
          student="StudentId:"+studentId;
      }
        if(qName.equals("name"))
      {
          student=student+"Name:";
      }
      if(qName.equals("age"))
      {
          student=student+"Age:";
      }
    }
    @Override
    public void characters(char[] ch, int start, int length) throws SAXException {
        String str=new String(ch,start,length);
        if(!str.equals(""))
        {
            student=student+str;
        }
        System.out.println(student);
    }
    @Override
    public void endDocument() throws SAXException {
        System.out.println("Son sinh vien la:"+count);
    }
}
Đây là ví dụ tổng hợp. Trong ví dụ này, chúng ta sử dụng cả 4 kỹ thuật để phân tích tài liệu XML với 4 sự kiện chính
-        startDocument()
-        startElement()
-        character()
-        endDocument()
Đồng thời với việc lấy nội dung của các element, chúng ta còn có thể lấy được các attribute.
Nhưng cái này có vẻ không hợp lý ở chỗ
HTML:
  if(!str.equals(""))
        {
            student=student+str;
        }
        System.out.println(student);
nó ra xấu với kg đúng nữa (trùng lặp)