Bài viết này mình trình bày cách sử dụng SAX Parser để đọc hoặc phân tích cú pháp tệp XML UTF-8.
SAX Parser để phân tích cú pháp file XML UTF-8
File XML chứa UTF-8 và các ký tự Trung Quốc.
<?xml version="1.0" encoding="utf-8"?>
<Company>
<staff id="1001">
<name>揚木金</name>
<role>support & code</role>
<salary currency="USD">5000</salary>
<bio><![CDATA[HTML tag <code>testing</code>]]></bio>
</staff>
<staff id="1002">
<name>yflow</name>
<role>admin</role>
<salary currency="EUR">8000</salary>
<bio><![CDATA[a & b]]></bio>
</staff>
</Company>
Ví dụ dưới đây đặt một UTF-8 mã hóa rõ ràng.
Lưu ý: Đối với trình xử lý SAX PrintAllHandlerSax, hãy tham khảo bài viết này .
package com.sharecs.xml.sax;
import com.sharecs.xml.sax.handler.PrintAllHandlerSax;
import org.xml.sax.InputSource;
import org.xml.sax.SAXException;
import org.xml.sax.XMLReader;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;
import java.io.IOException;
import java.nio.charset.StandardCharsets;
public class ReadXmlSaxParser {
private static final String FILENAME = "src/main/resources/staff-unicode.xml";
public static void main(String[] args) {
SAXParserFactory factory = SAXParserFactory.newInstance();
try {
SAXParser saxParser = factory.newSAXParser();
PrintAllHandlerSax handler = new PrintAllHandlerSax();
XMLReader xmlReader = saxParser.getXMLReader();
xmlReader.setContentHandler(handler);
InputSource source = new InputSource(FILENAME);
// explicitly set a encoding
source.setEncoding(StandardCharsets.UTF_8.displayName());
xmlReader.parse(source);
} catch (ParserConfigurationException | SAXException | IOException e) {
e.printStackTrace();
}
}
}
Kết quả
Start Document
Start Element : Company
Start Element : staff
Staff id : 1001
Start Element : name
End Element : name
Name : 揚木金
Start Element : role
End Element : role
Role : support & code
Start Element : salary
Currency :USD
End Element : salary
Salary : 5000
Start Element : bio
End Element : bio
Bio : HTML tag <code>testing</code>
End Element : staff
Start Element : staff
Staff id : 1002
Start Element : name
End Element : name
Name : yflow
Start Element : role
End Element : role
Role : admin
Start Element : salary
Currency :EUR
End Element : salary
Salary : 8000
Start Element : bio
End Element : bio
Bio : a & b
End Element : staff
End Element : Company
End Document
Mã hóa ký tự trong XML và Code ( Character Encoding in XML and code )
Đảm bảo rằng chúng ta đang sử dụng mã hóa chính xác để phân tích cú pháp tệp XML.
Đối với các file XML, cách tốt nhất là khai báo encoding thuộc tính.
<?xml version="1.0" encoding="character-encoding-here"?>
<Company>
</Company>
Ví dụ: bên dưới là file XML được mã hóa UTF-8.
<?xml version="1.0" encoding="utf-8"?>
<Company>
</Company>
Đối với SAX Parser, chúng ta có thể đặt mã hóa thông qua XMLReader
SAXParserFactory factory = SAXParserFactory.newInstance();
try {
SAXParser saxParser = factory.newSAXParser();
PrintAllHandlerSax handler = new PrintAllHandlerSax();
XMLReader xmlReader = saxParser.getXMLReader();
xmlReader.setContentHandler(handler);
InputSource source = new InputSource(FILENAME);
// utf-8
source.setEncoding(StandardCharsets.UTF_8.displayName());
// utf-16
// source.setEncoding(StandardCharsets.UTF_16.displayName());
// ascii
// source.setEncoding(StandardCharsets.US_ASCII.displayName());
xmlReader.parse(source);
} catch (ParserConfigurationException | SAXException | IOException e) {
e.printStackTrace();
}
Các lỗi phổ biến SAX
Dưới đây là một số lỗi phổ biến trong phân tích cú pháp SAX XML.
Byte 1 không hợp lệ của chuỗi UTF-8 1 byte
Tệp XML chứa các ký tự UTF-8 không hợp lệ, hãy đọc phần này .
Nội dung không được phép trong phần mở đầu
Tệp XML chứa văn bản không hợp lệ hoặc BOM trước khai báo XML, hãy đọc phần này .
Tên thực thể phải ngay sau dấu ‘&’ trong tham chiếu thực thể
Đây & là một ký tự không hợp lệ trong file XML, hãy thay thế nó bằng & hoặc bọc bằng CDATA chẳng hạn <![CDATA[a & b]]>