Skip to main content

[XML]Xử lý XML file với SAX trong java (Phần 2)

Bạn cần đọc [XML]Xử lý XML file với SAX trong java (Phần 1)

Xử lý các element khi phân tích file XML.
Trong quá trình phân tích, khi gặp thẻ bắt đầu, phương thức  startElement() sẽ được gọi, khi gặp thẻ kết thúc phương thức endElement()sẽ được gọi, khi gặp một thẻ rỗng startElement() sẽ được gọi trước, sau đó là endElement().

Nếu cặp thẻ kết thúc vào bắt đầu không khớp SAXException sẽ được quăng ra. 
Các tham số của startElement()endElement() là:

public void startElement(String namespaceURI, String localName, String qualifiedName, Attributes atts)
    throws SAXException;
public void endElement(String namespaceURI, String localName, String qualifiedName)
    throws SAXException;
 
- namespaceURI là một string là namespace của file XML, nếu file xml không có namespace thì nó bằng null.
- localName: là phần sau của của một thẻ chứa dấu hai chấm. ví dụ nếu tên của thẻ là SOAP-ENV:Body thì localName là Body. Nếu tên thẻ không chứa hai chấm thì localName vẫn là Body.
- qualifiedName: tên đầy đủ của thẻ.
- atts: list các thuộc tính của thẻ.

Một ví dụ biểu diễn XML dưới dạng cây:

package jbohn.example.xml;

import java.util.EmptyStackException;
import java.util.Stack;

import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTree;
import javax.swing.tree.DefaultMutableTreeNode;
import javax.swing.tree.MutableTreeNode;
import javax.swing.tree.TreeNode;

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

public class TreeViewerContentHandler extends DefaultHandler {

    //Sử dụng stack như một danh sách tạm giúp xác định phần tử vào trước (cha)
    private Stack nodes;
    private TreeNode root;

    public void startDocument() throws SAXException 
    {
        nodes = new Stack();
    }

    public void startElement(String namespaceURI, String localName,
            String qualifiedName, Attributes atts) {

        String data;
        if (namespaceURI.equals(""))
            data = localName;
        else {
            data = '{' + namespaceURI + "} " + qualifiedName;
        }
        MutableTreeNode node = new DefaultMutableTreeNode(data);
        
        try {
            
            MutableTreeNode parent = (MutableTreeNode) nodes.peek();
            parent.insert(node, parent.getChildCount());
            
        } catch (EmptyStackException e) 
        {
            //phần tử đầu tiên stack không tồn tại sẽ quăng ra exception này.
            root = node;
        }
        nodes.push(node);

    }
    public void endElement(String namespaceURI, String localName,
            String qualifiedName) {
        nodes.pop();
    }
    public TreeNode getTreeNode()
    {
        return root;
    }
}
 
package jbohn.example.xml;

import java.awt.BorderLayout;
import java.awt.EventQueue;
import java.util.EmptyStackException;
import java.util.Stack;

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTree;
import javax.swing.border.EmptyBorder;
import javax.swing.tree.DefaultMutableTreeNode;
import javax.swing.tree.MutableTreeNode;
import javax.swing.tree.TreeNode;

import org.xml.sax.Attributes;
import org.xml.sax.ContentHandler;
import org.xml.sax.SAXException;
import org.xml.sax.XMLReader;
import org.xml.sax.helpers.DefaultHandler;
import org.xml.sax.helpers.XMLReaderFactory;

public class XMLTreeviewer extends JFrame {

    private final static String xmlPath = System.getProperty("user.dir");
    private static TreeNode root;

    /**
     * Launch the application.
     */
    public static void main(String[] args) 
    {
        EventQueue.invokeLater(new Runnable() 
        {
            public void run() {
                try {
                    
                    String xmlFile = xmlPath + "\\XML_SAX.xml";
                    XMLReader parser = XMLReaderFactory.createXMLReader();
                    ContentHandler handler = new TreeViewerContentHandler();
                    parser.setContentHandler(handler);
                    parser.parse(xmlFile);
                    root = ((TreeViewerContentHandler) handler).getTreeNode();
                    XMLTreeviewer main = new XMLTreeviewer();
                    
                } catch (Exception e) {
                    System.err.println(e);
                }
            }
        });
    }

    /**
     * Create the frame.
     */
    public XMLTreeviewer() 
    {
        createGUI();
    }
    
    public void createGUI()
    {
        JTree tree = new JTree(root);
        JScrollPane treeView = new JScrollPane(tree);
        this.setTitle("XML Tree");
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        this.getContentPane().add(treeView);
        this.pack();
        this.setVisible(true);
    }

} 


 

Comments

Popular posts from this blog

How to Install SQL Server on MacOS with docker

 I'm writing a small tut for who need to install SQL Server on macOS using docker Step 1: Download the SQL Server Image sudo docker pull mcr.microsoft.com/mssql/server:2019-latest Step 2: Launch the SQL Server Image in Docker docker run -d --name example_sql_server -e 'ACCEPT_EULA=Y' -e 'SA_PASSWORD=Pass.word-123' -p 1433:1433 mcr.microsoft.com/mssql/server:2019-latest Step 3: Check the SQL Server Docker Container docker ps -a Step 4: Install SQL Server Command-Line Tool sudo npm install -g sql-cli Step 5: Connect to SQL Server  5.1 Using Command mssql -u sa -p Pass.word-123 5.2: Using VSCode to connect to sql server Using the extension SQL Server (mssql)

What is API Gateway?

  What does API gateway do? The diagram below shows the detail. Step 1 - The client sends an HTTP request to the API gateway. Step 2 - The API gateway parses and validates the attributes in the HTTP request. Step 3 - The API gateway performs allow-list/deny-list checks. Step 4 - The API gateway talks to an identity provider for authentication and authorization. Step 5 - The rate limiting rules are applied to the request. If it is over the limit, the request is rejected. Steps 6 and 7 - Now that the request has passed basic checks, the API gateway finds the relevant service to route to by path matching. Step 8 - The API gateway transforms the request into the appropriate protocol and sends it to backend microservices. Steps 9-12 : The API gateway can handle errors properly, and deals with faults if the error takes a longer time to recover (circuit break). It can also leverage ELK (Elastic-Logstash-Kibana) stack for logging and monitoring. We sometimes cache data in the API gatew...