錯(cuò)誤處理
模式的默認(rèn)響應(yīng)方式是,如果遇到問(wèn)題則拋出 SAXException,否則什么也不做。但是,可以提供 SAX ErrorHandler 來(lái)接收關(guān)于文檔問(wèn)題的更詳盡的信息。比方說(shuō),假設(shè)要記錄所有驗(yàn)證錯(cuò)誤,但又不希望遇到錯(cuò)誤時(shí)停止處理。可以安裝一個(gè)像 清單 3 那樣的錯(cuò)誤處理程序。
清單 3. 使用 RELAX NG 驗(yàn)證 DocBook 文檔
import org.xml.sax.ErrorHandler;
import org.xml.sax.SAXException;
import org.xml.sax.SAXParseException;
public class ForgivingErrorHandler implements ErrorHandler {
public void warning(SAXParseException ex) {
System.err.println(ex.getMessage());
}
public void error(SAXParseException ex) {
System.err.println(ex.getMessage());
}
public void fatalError(SAXParseException ex) throws SAXException {
throw ex;
}
}
要安裝該錯(cuò)誤處理程序,需要?jiǎng)?chuàng)建它的一個(gè)實(shí)例并傳遞給 Validator 的 setErrorHandler() 方法:
ErrorHandler lenient = new ForgivingErrorHandler();
validator.setErrorHandler(lenient);
模式擴(kuò)充
有些模式不僅僅執(zhí)行驗(yàn)證。除了用是否回答文檔有效與否的問(wèn)題外,還為文檔補(bǔ)充 其他信息。比方說(shuō),可以提供默認(rèn)的屬性值。還可以給元素或?qū)傩再x予 int 或 gYear 這樣的類型。驗(yàn)證程序可以創(chuàng)建這種補(bǔ)充了類型信息的文檔,并寫(xiě)入 javax.xml.transform.Result 對(duì)象。只需要傳遞 Result 作為驗(yàn)證的第二個(gè)參數(shù)。比如,清單 4 在驗(yàn)證輸入文檔的同時(shí),還創(chuàng)建結(jié)合有模式輸入的擴(kuò)展后的 DOM 文檔。
清單 4. 用模式擴(kuò)充文檔
import java.io.*;
import javax.xml.transform.dom.*;
import javax.xml.validation.*;
import javax.xml.parsers.*;
import org.w3c.dom.*;
import org.xml.sax.SAXException;
public class DocbookXSDAugmenter {
public static void main(String[] args)
throws SAXException, IOException, ParserConfigurationException {
SchemaFactory factory
= SchemaFactory.newInstance("http://www.w3.org/2001/XMLSchema");
File schemaLocation = new File("/opt/xml/docbook/xsd/docbook.xsd");
Schema schema = factory.newSchema(schemaLocation);
Validator validator = schema.newValidator();
DocumentBuilderFactory domFactory = DocumentBuilderFactory.newInstance();
domFactory.setNamespaceAware(true); // never forget this
DocumentBuilder builder = domFactory.newDocumentBuilder();
Document doc = builder.parse(new File(args[0]));
DOMSource source = new DOMSource(doc);
相關(guān)推薦:計(jì)算機(jī)等級(jí)考試二級(jí)Java經(jīng)典算法大全匯總
北京 | 天津 | 上海 | 江蘇 | 山東 |
安徽 | 浙江 | 江西 | 福建 | 深圳 |
廣東 | 河北 | 湖南 | 廣西 | 河南 |
海南 | 湖北 | 四川 | 重慶 | 云南 |
貴州 | 西藏 | 新疆 | 陜西 | 山西 |
寧夏 | 甘肅 | 青海 | 遼寧 | 吉林 |
黑龍江 | 內(nèi)蒙古 |