Trang chủ » Archives for tháng 4 2014
So sánh XMLReader vs SAX parser
XMLReader vs SAX parser
Recently, I tried to port some Java code to C#. Most Java code use SAX to process XML. .net framework library does not support SAX. It supports XMLReader instead. I tried to compare both approaches to see which one would result in cleaner implementation. I encountered two articles. The first article is on xml.com. The article gave a nice example on how to port SAX code to XMLReader code. The second article is by Dino Esposito on zdnet. The article favors the .net approach considering Dino is largely a Microsoft guy
The difference is tat SAX use a push model while XMLReader uses a pull model. With SAX, we just need to set up an event handler. The default SAX parser acts as a driver to parse the document and fire the events. With XMLReader, we have to create a loop that keeps calling the read method of the XMLReader class. We then have to implement a switch construction that dispatch the processing to other procedures depending on the node type. This model is similar to how we process the Windows message loop. It is possible to construct the dispatching mechanism to be like that of SAX. At the first glance, it takes less code to setup SAX parser. However, in the subsequent processing, we can call one of the readxxx method of XMLReader to pull additional information. This would gives us more control and cleaner implementation than the SAX model.
DOM là gì ? và DOM làm gì ?
DOM and its benefits:
-DOM hỗ trợ tất cả các nhược điểm mà SAX không hỗ trợ.
-Đặc điểm của DOM:
+ Hỗ trợ truy cập tới nhiều file XML.
+Quản lý cấu trúc dữ liệu phức tạp.
+Cho phép thay đổi dữ liệu.
+Cho phép truy cập đến các thành phần trong file XML 1 cach ngẫu nhiên, liên tục.
Components of DOM:
-XML hiển thị dữ liệu theo cấu trúc hình cây, Dom cũng vậy.
-DOM 1 cấu trúc hình cây theo file XML với mỗi thẻ của XML là một node.
Working of DOM:
-Cách làm việc tương tự giống như SAX. Trong DOM chúng ta dùng Document (thay cho parser trong SAX), có DocumentBuilder, DocumentBuilderFactory (thay cho SaxParserFactory),….
Java interface of DOM:
-Document
-NodeList: Lưu giữ danh sách các list
-Element: Các thẻ
-Attr: Attribute
-Text
-Node
-DOM hỗ trợ tất cả các nhược điểm mà SAX không hỗ trợ.
-Đặc điểm của DOM:
+ Hỗ trợ truy cập tới nhiều file XML.
+Quản lý cấu trúc dữ liệu phức tạp.
+Cho phép thay đổi dữ liệu.
+Cho phép truy cập đến các thành phần trong file XML 1 cach ngẫu nhiên, liên tục.
Components of DOM:
-XML hiển thị dữ liệu theo cấu trúc hình cây, Dom cũng vậy.
-DOM 1 cấu trúc hình cây theo file XML với mỗi thẻ của XML là một node.
Working of DOM:
-Cách làm việc tương tự giống như SAX. Trong DOM chúng ta dùng Document (thay cho parser trong SAX), có DocumentBuilder, DocumentBuilderFactory (thay cho SaxParserFactory),….
Java interface of DOM:
-Document
-NodeList: Lưu giữ danh sách các list
-Element: Các thẻ
-Attr: Attribute
-Text
-Node
Describe Validate XML, DTD Handler, Lexical Event, EntityResolver, Filter Validate
Describe Validate XML, DTD Handler, Lexical Event, EntityResolver, Filter
Validate là một công cụ mạnh mẽ.
- Nó cho phép bạn nhanh chóng kiểm tra đầu vào gần giống với dạng bạn mong đợi và nhanh chóng loại bỏ bất kỳ tài liệu nào khác xa với những gì mà quá trình của bạn có thể xử lý.
- Nếu có một vấn đề với dữ liệu, thì tốt hơn nên tìm ra sớm còn hơn muộn. Trong ngữ cảnh của Ngôn ngữ đánh dấu mở rộng (XML), việc Validate thường liên quan đến việc viết một đặc tả chi tiết cho các nội dung của tài liệu theo bất kỳ một số ngôn ngữ lược đồ nào như XSD (XML Schema Language) của W3C , RELAX NG, các DTD (Document Type Definition), và Schematron. Đôi khi thực hiện xác nhận hợp lệ trong khi phân tích cú pháp, đôi lúc ngay sau đó. Tuy nhiên, thường thực hiện nó trước khi bất kỳ bước xử lý đầu vào tiếp theo nào diễn ra. DTD Handler DTD Handler là một interface để nhận thông báo của các sự kiện liên quan đến DTD Nếu như ứng dụng SAX cần thông tin về notations và unparsed entities thì ứng dụng sẽ implement và đăng ký một thể hiện với SAX parser sử dụng các phương thức setDTDHandler của parser. Parser sử dụng các thể hiện đó để để thông báo các notations và unparsed entities cho ứng dụng. Lexical Event LexicalHandler dùng để xác định các comments, phần CDATA , và những thứ liên quan đến các parsed entities. Entity Resolver Nếu một ứng dụng SAX cần thực hiện xử lý tùy biến cho các entities bên ngoài, nó phải implement interface này và đăng ký một thể hiện với SAX driver bằng cách sử dụng phương pháp setEntityResolver. Filter Là SAX interface đóng vai trò là 2 stream cơ bản: - 1 là sự kiện từ SAX driver (thường là một XMLReader) cho các ứng dụng; - 2 là request từ các ứng dụng tới SAX driver.
Ví dụ :
public class TomcatUserHandler extends DefaultHandler {
@Override
public void warning(SAXParseException e) throws SAXException {
System.out.println("WraningError at "+e.getLineNumber()+e.getMessage());
}
@Override
public void error(SAXParseException e) throws SAXException {
System.out.println("error at "+e.getLineNumber()+e.getMessage());
}
@Override
public void fatalError(SAXParseException e) throws SAXException {
System.out.println("faltaError at "+e.getLineNumber()+e.getMessage());
}
}
-----------------
public class TomcatUser {
/**
* @param args the command line arguments
*/
public static void main(String[] args) {
try {
// TODO code application logic here
SAXParserFactory factory = SAXParserFactory.newInstance();
SAXParser parser = factory.newSAXParser();
parser.parse("tomcat-users.xml",new TomcatUserHandler());
} catch (IOException ex) {
Logger.getLogger(TomcatUser.class.getName()).log(Level.SEVERE, null, ex);
} catch (ParserConfigurationException ex) {
Logger.getLogger(TomcatUser.class.getName()).log(Level.SEVERE, null, ex);
} catch (SAXException ex) {
Logger.getLogger(TomcatUser.class.getName()).log(Level.SEVERE, null, ex);
}
}
}
- Nó cho phép bạn nhanh chóng kiểm tra đầu vào gần giống với dạng bạn mong đợi và nhanh chóng loại bỏ bất kỳ tài liệu nào khác xa với những gì mà quá trình của bạn có thể xử lý.
- Nếu có một vấn đề với dữ liệu, thì tốt hơn nên tìm ra sớm còn hơn muộn. Trong ngữ cảnh của Ngôn ngữ đánh dấu mở rộng (XML), việc Validate thường liên quan đến việc viết một đặc tả chi tiết cho các nội dung của tài liệu theo bất kỳ một số ngôn ngữ lược đồ nào như XSD (XML Schema Language) của W3C , RELAX NG, các DTD (Document Type Definition), và Schematron. Đôi khi thực hiện xác nhận hợp lệ trong khi phân tích cú pháp, đôi lúc ngay sau đó. Tuy nhiên, thường thực hiện nó trước khi bất kỳ bước xử lý đầu vào tiếp theo nào diễn ra. DTD Handler DTD Handler là một interface để nhận thông báo của các sự kiện liên quan đến DTD Nếu như ứng dụng SAX cần thông tin về notations và unparsed entities thì ứng dụng sẽ implement và đăng ký một thể hiện với SAX parser sử dụng các phương thức setDTDHandler của parser. Parser sử dụng các thể hiện đó để để thông báo các notations và unparsed entities cho ứng dụng. Lexical Event LexicalHandler dùng để xác định các comments, phần CDATA , và những thứ liên quan đến các parsed entities. Entity Resolver Nếu một ứng dụng SAX cần thực hiện xử lý tùy biến cho các entities bên ngoài, nó phải implement interface này và đăng ký một thể hiện với SAX driver bằng cách sử dụng phương pháp setEntityResolver. Filter Là SAX interface đóng vai trò là 2 stream cơ bản: - 1 là sự kiện từ SAX driver (thường là một XMLReader) cho các ứng dụng; - 2 là request từ các ứng dụng tới SAX driver.
Ví dụ :
public class TomcatUserHandler extends DefaultHandler {
@Override
public void warning(SAXParseException e) throws SAXException {
System.out.println("WraningError at "+e.getLineNumber()+e.getMessage());
}
@Override
public void error(SAXParseException e) throws SAXException {
System.out.println("error at "+e.getLineNumber()+e.getMessage());
}
@Override
public void fatalError(SAXParseException e) throws SAXException {
System.out.println("faltaError at "+e.getLineNumber()+e.getMessage());
}
}
-----------------
public class TomcatUser {
/**
* @param args the command line arguments
*/
public static void main(String[] args) {
try {
// TODO code application logic here
SAXParserFactory factory = SAXParserFactory.newInstance();
SAXParser parser = factory.newSAXParser();
parser.parse("tomcat-users.xml",new TomcatUserHandler());
} catch (IOException ex) {
Logger.getLogger(TomcatUser.class.getName()).log(Level.SEVERE, null, ex);
} catch (ParserConfigurationException ex) {
Logger.getLogger(TomcatUser.class.getName()).log(Level.SEVERE, null, ex);
} catch (SAXException ex) {
Logger.getLogger(TomcatUser.class.getName()).log(Level.SEVERE, null, ex);
}
}
}
Làm thế nào để đọc XML file trong Java (SAX Parser) ?
Đầu tiên chúng ta sẽ tạo ra 1 XML file :
Sau đó chúng ta tạo 1 File để đọc cái XML
Chúng ta tạo thêm 1 file DefaultHender1.java, class DefaultHender1 extends từ cái DefaultHender
Chúc các bạn thành công :)
Introduction to JAXP (Java API for XML Processing)
Java API for XML Processing, hay JAXP, là một trong các API cho lập trình Java XML.
Nó có 2 Interface cơ bản là :
DOM (Document Object Model)
SAX (Simple API for XML)
StAX (Java API for XML Processing)
SAX là gì ? : nó phân tích dữ liệu XML dựa vào sự kiện trong quá trình đọc file XML từ trên xuống dưới.
Để dùng được SAX thì các ngôn ngữ lập trình cần định nghĩa ra sự kiện và các hàm tương ứng. Khi parser gặp sự kiện mở thẻ, parser sẽ gọi lại các đoạn code trong hàm “startElement” để thi hành Một điểm cần lưu ý rằng SAX không ghi nhớ XML như một cấu trúc cây trên bộ nhớ. SAX chỉ xây dựng cấu trúc của nhiệm vụ đang thi hành trên bộ nhớ do đó SAX sẽ thực hiện nhanh hơn và ít tốn tài nguyên hơn
DOM là gì ?: Tất cả các thành phần trong XML đều được xem như là 1 “node”. Trong đó root là document node, các thẻ là element node, thuộc tính là attribute node, text là text node, ghi chú là comment node…. Khi parser đọc XML thành đối tượng DOM trên bộ nhớ chúng ta sẽ có 1 cấu trúc cây với các đối tượng là các node và trên cấu trúc này chúng ta sẽ thấy mối quan hệ phân tầng giữa các node. Trên cùng là thẻ root (document node) từ node này chúng ta có thẻ rẻ nhánh đến các tầng thấp hơn của cấu trúc cây cho đến khi chúng ta chạm tới text node là tầng thấp nhất của cấu trúc này. Mối quan hệ giữa các node được mô tả bằng thuật ngữ “parent” và “child” (cha và con). Thuật ngữ “leaf node” dùng để chỉ các node không có child node. Chúng ta có ví dụ sau mô tả việc chuyển đổi từ XML sang DOM: File XML: Cấu trúc DOM đọc từ file XML trên: Do DOM là tiêu chuẩn của W3School không phụ thuộc vào ngôn ngữ lập trình do đó tất cả các ngôn ngữ lập trình đều có thể dùng tiêu chuẩn này để đọc dữ liệu từ XML
Nó có 2 Interface cơ bản là :
DOM (Document Object Model)
SAX (Simple API for XML)
StAX (Java API for XML Processing)
SAX là gì ? : nó phân tích dữ liệu XML dựa vào sự kiện trong quá trình đọc file XML từ trên xuống dưới.
Để dùng được SAX thì các ngôn ngữ lập trình cần định nghĩa ra sự kiện và các hàm tương ứng. Khi parser gặp sự kiện mở thẻ, parser sẽ gọi lại các đoạn code trong hàm “startElement” để thi hành Một điểm cần lưu ý rằng SAX không ghi nhớ XML như một cấu trúc cây trên bộ nhớ. SAX chỉ xây dựng cấu trúc của nhiệm vụ đang thi hành trên bộ nhớ do đó SAX sẽ thực hiện nhanh hơn và ít tốn tài nguyên hơn
DOM là gì ?: Tất cả các thành phần trong XML đều được xem như là 1 “node”. Trong đó root là document node, các thẻ là element node, thuộc tính là attribute node, text là text node, ghi chú là comment node…. Khi parser đọc XML thành đối tượng DOM trên bộ nhớ chúng ta sẽ có 1 cấu trúc cây với các đối tượng là các node và trên cấu trúc này chúng ta sẽ thấy mối quan hệ phân tầng giữa các node. Trên cùng là thẻ root (document node) từ node này chúng ta có thẻ rẻ nhánh đến các tầng thấp hơn của cấu trúc cây cho đến khi chúng ta chạm tới text node là tầng thấp nhất của cấu trúc này. Mối quan hệ giữa các node được mô tả bằng thuật ngữ “parent” và “child” (cha và con). Thuật ngữ “leaf node” dùng để chỉ các node không có child node. Chúng ta có ví dụ sau mô tả việc chuyển đổi từ XML sang DOM: File XML: Cấu trúc DOM đọc từ file XML trên: Do DOM là tiêu chuẩn của W3School không phụ thuộc vào ngôn ngữ lập trình do đó tất cả các ngôn ngữ lập trình đều có thể dùng tiêu chuẩn này để đọc dữ liệu từ XML
Nguồn bọ rùa
Đăng ký:
Bài đăng (Atom)