1. 獲取 SAX 解析器實例
XMLReader parser = org.xml.sax.helpers.XMLReaderFactory.createXMLReader();
通過使用這個方法,您需要將系統屬性 org.xml.sax.driver
設置成想要裝入的解析器的類名。這是特定於供應商的類;對於 Xerces,它應該是 org.apache.xerces.parsers.SAXParser
。用 -D
開關將這個參數指定給 Java 編譯器:
java -Dorg.xml.sax.driver=org.apache.xerces.parsers.SAXParser some.sample.Class
當然,您要確保指定的類存在並在類路徑上。
可以用兩種方法配置解析器:功能和屬性。 功能包括打開或關閉特定功能,比如驗證。 屬性包括設置解析器所使用的特定項的值,如用來驗證所有文檔的模式位置。
功能是通過解析器上名爲 setFeature()
的方法設置的
2. 設置 SAX 解析器的功能
- // Obtain an instance of an XMLReader implementation from a system property
- XMLReader parser = org.xml.sax.helpers.XMLReaderFactory.createXMLReader();
- String featureName = "some feature URI";
- boolean featureOn = true;
- try {
- parser.setFeature(featureName, featureOn);
- } catch (SAXNotRecognizedException e) {
- System.err.println("Unknown feature specified: " + e.getMessage());
- } catch (SAXNotSupportedException e) {
- System.err.println("Unsupported feature specified: " + e.getMessage());
- } catch (SAXException e) {
- System.err.println("Error in setting feature: " + e.getMessage());
- }
3. 一些常見功能
- // Obtain an instance of an XMLReader implementation from a system property
- XMLReader parser = org.xml.sax.helpers.XMLReaderFactory.createXMLReader();
- try {
- // Turn on validation
- parser.setFeature("http://xml.org/sax/features/validation", true);
- // Ensure namespace processing is on (the default)
- parser.setFeature("http://xml.org/sax/features/namespaces", true);
- } catch (SAXNotRecognizedException e) {
- System.err.println("Unknown feature specified: " + e.getMessage());
- } catch (SAXNotSupportedException e) {
- System.err.println("Unsupported feature specified: " + e.getMessage());
- } catch (SAXException e) {
- System.err.println("Error in setting feature: " + e.getMessage());
- }
請注意,雖然解析器有幾個標準 SAX 功能,但這些解析器可以自由地添加自己的特定於供應商的功能。例如,Apache Xerces-J 添加了一些考慮動態驗證以及遇到致命錯誤之後繼續處理的功能。請參考解析器供應商的文檔,以獲取相關的功能 URI。
一旦理解了功能,就很容易理解屬性。除了屬性將對象作爲參數而功能獲取布爾值外,它們以完全相同的方式操作。我們使用
setProperty()
方法來設置屬性
4. 設置 SAX 解析器的屬性
- 1. // Obtain an instance of an XMLReader implementation from a system property
- XMLReader parser = org.xml.sax.helpers.XMLReaderFactory.createXMLReader();
- String propertyName = "some property URI";
- try {
- parser.setProperty(propertyName, obj-arg);
- } catch (SAXNotRecognizedException e) {
- System.err.println("Unknown property specified: " + e.getMessage());
- } catch (SAXNotSupportedException e) {
- System.err.println("Unsupported property specified: " + e.getMessage());
- } catch (SAXException e) {
- System.err.println("Error in setting property: " + e.getMessage());
- }
這裏使用相同的錯誤處理框架,所以您可以容易地在兩種類型的配置選項之間複製代碼。和功能一樣,SAX 提供了一組標準屬性,
供應商可以添加他們自己的擴展。常見的SAX 標準的屬性考慮到了設置詞法處理程序
(Lexical Handler)和聲明處理程序(Declaration Handler)
像 Apache Xerces 之類的解析器對它們進行了擴展,例如,使它們能夠設置輸入緩衝區大小以及要在驗證中使用的外部模式的位置。
5. 一些常見屬性
- // Obtain an instance of an XMLReader implementation from a system property
- XMLReader parser = org.xml.sax.helpers.XMLReaderFactory.createXMLReader();
- try {
- // Set the chunk to read in by SAX
- parser.setProperty("http://apache.org/xml/properties/input-buffer-size",
- new Integer(2048));
- // Set a LexicalHandler
- parser.setProperty("http://xml.org/sax/properties/lexical-handler",
- new MyLexicalHandler());
- } catch (SAXNotRecognizedException e) {
- System.err.println("Unknown feature specified: " + e.getMessage());
- } catch (SAXNotSupportedException e) {
- System.err.println("Unsupported feature specified: " + e.getMessage());
- } catch (SAXException e) {
- System.err.println("Error in setting feature: " + e.getMessage());
- }
通過理解功能和屬性,您幾乎可以讓解析器做任何事情。