Thứ Hai, 28 tháng 7, 2014

Working with SAX

Practise1 - Module 2.

Đề bài: Create a program to accept the tomcat-users.xml file as a command line parameter and count the number of users defined in this configuration file. At the end of processing, it requires to print the number of users on the console.


Đầu tiên ta tạo một ứng dụng console java bình thường. Tiếp đó ta tạo file xml với tên tomcat-user.xml như dưới đây.


<?xml version="1.0" encoding="UTF-8"?>
<tomcat-users>
    <role rolename="tomcat"/>
    <role rolename="role1"/>
    <user username="tomcat" password="tomcat" roles="tomcat"/>
    <user username="both" password="tomcat" roles="tomcat,role1"/>
    <user username="role1" password="tomcat" roles="role1"/>
    
    <user password="admin" role="manager-script,admin" username="admin"/>

</tomcat-users>


Tiếp đó ta sẽ tạo một lớp java để làm nhiệm vụ xử lý các nhiệm vụ như việc đọc thông tin từ file xml, lớp này sẽ đón vai trò là một handler.

package pm.handler;

import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;

/**
 *
 * @author Nguyen Minh An
 */
public class CountNumberOfTagHandler extends DefaultHandler{
    private int demSoTags; // Biến toàn cục dùng để lưu lại thông tin số tag có trong file xml

    @Override
    public void startDocument() throws SAXException {
        demSoTags = 0; //Khi bắt đầu đọc tài liệu ta sẽ khởi tạo giá trị của biến demSoTags = 0;
    }

    @Override
    public void startElement(String string, String string1, String string2, Attributes atrbts) throws SAXException {
        demSoTags++; // Với mỗi lần parser bắt đầu đọc một element thì ta sẽ tăng thêm một giá trị cho biến demSoTags
    }

    @Override
    public void endDocument() throws SAXException {
        //Khi kết thúc việc đọc tài liệu này ta không làm gì cả nên method này ta sẽ để trống.
    }

    public int getDemSoTags() {
        return demSoTags; // Phương thức này sẽ lấy về giá trị của biến demSoTags
    }


}

Trong phương thức main của ứng dụng ta sẽ viết các đoạn mã sau:

package practice1_module2;

import java.util.logging.Level;
import java.util.logging.Logger;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;
import pm.handler.CountNumberOfTagHandler;

/**
 *
 * @author Nguyen Minh An
 */
public class Practice1_Module2 {

    public static void main(String[] args) {
        try {
/** Tạo ra một đối tượng của lớp SAXParserFactory */
            SAXParserFactory spf = SAXParserFactory.newInstance();

/**Tạo ra một đối tượng SAXParser*/
            SAXParser sp = spf.newSAXParser();

/**Tạo ra đối tượng của lớp CountNumberOfTaghandler*/
 CountNumberOfTagHandler countNumberOfTagHandler = new CountNumberOfTagHandler();

/**Tiến hành quét file xml bằng đối tượng của lớp handler*/
 sp.parse("D:\\NetBean\\Practice1_Module2\\src\\tomcat-users.xml", countNumberOfTagHandler);

/**In ra màn hình kết quả đếm được*/
            System.out.println(countNumberOfTagHandler.getDemSoTags());
        } catch (Exception ex) {
            Logger.getLogger(Practice1_Module2.class.getName()).log(Level.SEVERE, null, ex);
        }

    }


}

Practice 2 - Module 2.

Đề bài:

Create the student.xml file that stores a list of registered students. Write a program for printing the name and ID of all registered students provided in student.xml. Make necessary arrangements to accept a command line parameter from the user to specify the name of the XML document that holds the list of registered students.

Đầu tiên ta tạo một project java với tên Practice2_Module2. Tiếp đó tạo ra một file xml như sau:

<?xml version="1.0" encoding="UTF-8"?>
<root>
    <student id="1" name="Nguyen Minh An" />    
    <student id="2" name="Nguyễn Tuấn Anh"/>
    <student id="3" name="Nguyễn Việt Hoàng" />
    <student id="4" name="Nguyễn Hoài Linh" />
    <student id="5" name="Nguyễn Thu Hằng" />

</root>

Tiếp đó là một lớp java với tên ReadIdAndNameOfStudent.java và viết vào đoạn code dưới:

package pm2.handler;

import java.util.LinkedList;
import java.util.List;
import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;
import pm2.entity.Student;

/**
 *
 * @author Nguyen Minh An
 */
public class ReadIdAndNameOfStudent extends DefaultHandler {

    private int count;
    private List<Student> listStudent = new LinkedList<>();;
    

    @Override
    public void startDocument() throws SAXException {
        count = 0;
    }

    public int getCount() {
        return count;
    }
    
    
    @Override
    public void startElement(String string, String string1, String string2, Attributes atrbts) throws SAXException {
        String name = atrbts.getValue("name");
        String id = atrbts.getValue("id");
        Student s = new Student(id, name);
        listStudent.add(s);
        count++;
    }
   
    
    
    public List<Student> getListStudent() {
        return listStudent;
    }

}

Ở lớp chứa hàm main ta viết code như sau:



package practice2_module2;

import java.util.logging.Level;
import java.util.logging.Logger;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;
import pm2.entity.Student;
import pm2.handler.ReadIdAndNameOfStudent;

/**
 *
 * @author Nguyen Minh An
 */
public class Practice2_Module2 {

    public static void main(String[] args) {
        try {
            SAXParserFactory spf = SAXParserFactory.newInstance();
            SAXParser sp = spf.newSAXParser();
            ReadIdAndNameOfStudent readIdAndNameOfStudent = new ReadIdAndNameOfStudent();
            sp.parse("D:\\NetBean\\Practice2_Module2\\src\\Student.xml",readIdAndNameOfStudent );
            System.out.println(readIdAndNameOfStudent.getCount());
            for (Student s : readIdAndNameOfStudent.getListStudent()) {
                System.out.println("Id:" + s.getId());
                System.out.println("Name:" +s.getName());
            }
            
        } catch (Exception ex) {
            Logger.getLogger(Practice2_Module2.class.getName()).log(Level.SEVERE, null, ex);
        }
    }
    
}

Practice3 - Module2

Đề bài:
Write a program which demonstrates the use of SAX parser for a simple search in XML document. The program searches a specified user in the tomcatusers.xml  file  and  prints  an  the  role of the given user on search completion. This program should include two command-line parameters. The first parameter specifies the tomcat-users.xml  file  and  the  second parameter specifies the user name to search in the configuration file.

Đầu tiên tạo lớp để xử lý với tên SearchingHandler như dưới:


package pm.handler;

import java.util.LinkedList;
import java.util.List;
import javax.xml.stream.events.StartDocument;
import javax.xml.stream.events.StartElement;
import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;

/**
 *
 * @author Nguyen Minh An
 */
public class SearchingHandler extends DefaultHandler {

    private final List<String> listUsername = new LinkedList<>();

    @Override
    public void startDocument() throws SAXException {

    }

    @Override
    public void startElement(String string, String string1, String string2, Attributes atrbts) throws SAXException {
        String username = atrbts.getValue("username");
        if (username != null) {
            listUsername.add(username);
        }

    }

    public String SearchUsername(String username) {
        List<String> list = new LinkedList<>();
        for (String s : listUsername) {
            if (s.contains(username)) {
                return s;
            }
        }
        return "";
    }


}

Tạo một file xml với tên tomcat-users.xml:

<?xml version="1.0" encoding="UTF-8"?>
<tomcat-users>
    <role rolename="tomcat"/>
    <role rolename="role1"/>
    <user username="tomcat" password="tomcat" roles="tomcat"/>
    <user username="both" password="tomcat" roles="tomcat,role1"/>
    <user username="role1" password="tomcat" roles="role1"/>
    
    <user password="admin" role="manager-script,admin" username="admin"/>

</tomcat-users>


Lớp có hàm main:


package practice3_module2;

import java.io.IOException;
import java.util.Scanner;
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;
import pm.handler.SearchingHandler;

/**
 *
 * @author Nguyen Minh An
 */
public class Practice3_Module2 {

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        try {
            SAXParserFactory spf = SAXParserFactory.newInstance();
            SAXParser sp = spf.newSAXParser();

            Scanner scan = new Scanner(System.in);
            System.out.println("Nhap vao ten file:");
            String filename = scan.nextLine();

            SearchingHandler sh = new SearchingHandler();
            sp.parse("D:\\NetBean\\Practice3_Module2\\src\\db\\" + filename, sh);
            
            System.out.println("Nhap vao username");
            String username = scan.nextLine();

//            for (String string : sh.SearchUsername(username)) {
//                System.out.println(string);
//            }
            System.out.println(sh.SearchUsername(username));

        } catch (ParserConfigurationException | SAXException | IOException ex) {
            Logger.getLogger(Practice3_Module2.class.getName()).log(Level.SEVERE, null, ex);
        }
    }


}

Source Code



Không có nhận xét nào:

Đăng nhận xét