Mạng xã hội
Hoặc copy link
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.
<?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>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 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.
<?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> 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();
}Dưới đây là một số lỗi phổ biến trong phân tích cú pháp SAX XML.
Tệp XML chứa các ký tự UTF-8 không hợp lệ, hãy đọc phần này .
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 .
Đâ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]]>