错误处理+ T9 ]9 `$ H+ c+ R. n! @) d/ m
模式的默认响应方式是,如果遇到问题则抛出 SAXException,否则什么也不做。但是,可以提供 SAX ErrorHandler 来接收关于文档问题的更详尽的信息。比方说,假设要记录所有验证错误,但又不希望遇到错误时停止处理。可以安装一个像 清单 3 那样的错误处理程序。
6 d" q9 o: Y# M) Y& l' B 清单 3. 使用 RELAX NG 验证 DocBook 文档
. @/ x1 V( n5 o: F- Y import org.xml.sax.ErrorHandler;
! l; S' S+ f8 W import org.xml.sax.SAXException;
4 M8 {5 f( ~2 p1 h2 {& @ import org.xml.sax.SAXParseException;
% @& m( G$ u' z' W/ T public class ForgivingErrorHandler implements ErrorHandler {* q, n. ^* N1 y
public void warning(SAXParseException ex) {5 {4 U) f! N( E
System.err.println(ex.getMessage());
: ^5 A% K0 H% H" V2 D6 b }+ U0 |( P+ v. _" R2 y, ~5 A
public void error(SAXParseException ex) {7 F+ W8 u; M4 _/ y% Q8 R1 [
System.err.println(ex.getMessage());
8 e* a, P W( @+ v9 m }
7 ]+ ^# F* }/ a3 F B$ }2 X public void fatalError(SAXParseException ex) throws SAXException {4 [/ U2 b* F/ ?" S4 p
throw ex;; U6 Y1 C# M" B
}
; y. f/ v1 h+ Z5 z. o! e! n }7 K" z2 y+ i6 |( m
要安装该错误处理程序,需要创建它的一个实例并传递给 Validator 的 setErrorHandler() 方法:# k$ ?& Z" u* g8 u
ErrorHandler lenient = new ForgivingErrorHandler();; w/ n- N3 J+ J/ h
validator.setErrorHandler(lenient);8 o6 s' F" y$ {2 j8 M. V& w
模式扩充3 c* j/ ^* g6 H6 a/ Q
有些模式不仅仅执行验证。除了用是否回答文档有效与否的问题外,还为文档补充 其他信息。比方说,可以提供默认的属性值。还可以给元素或属性赋予 int 或 gYear 这样的类型。验证程序可以创建这种补充了类型信息的文档,并写入 javax.xml.transform.Result 对象。只需要传递 Result 作为验证的第二个参数。比如,清单 4 在验证输入文档的同时,还创建结合有模式输入的扩展后的 DOM 文档。
$ q0 _; {; f* O1 k 清单 4. 用模式扩充文档, `! o+ U/ D1 H. q' l
import java.io.*;
- x' n( I5 s E! U h j import javax.xml.transform.dom.*;
' j# g6 }1 d# R8 m% ~+ ?' v8 L import javax.xml.validation.*;
5 ^8 ~8 |: a" t4 ?$ w import javax.xml.parsers.*;
$ a/ d# l4 B0 r2 m! j) P; ^1 U import org.w3c.dom.*;1 q! T, H3 v4 d, C( ?' c3 w& t% e
import org.xml.sax.SAXException;% K: a+ `0 Q2 q8 C( d6 y
public class DocbookXSDAugmenter {7 b: K& [& n% r' ?
public static void main(String[] args)0 t0 w+ w, `! b+ d9 J
throws SAXException, IOException, ParserConfigurationException {
+ F* _1 @5 T$ X6 i5 b SchemaFactory factory! e, n6 k9 K3 ^2 G9 \' z
= SchemaFactory.newInstance("http://www.w3.org/2001/XMLSchema");
/ k, H" @3 j' H! \1 {+ t3 B File schemaLocation = new File("/opt/xml/docbook/xsd/docbook.xsd");
% ~" k; ~% j4 p+ Q" F8 X$ ]5 e: n Schema schema = factory.newSchema(schemaLocation);. z% M- O _/ }8 h8 e+ N! I% Z
Validator validator = schema.newValidator();
/ S6 b9 H, J$ ~3 K DocumentBuilderFactory domFactory = DocumentBuilderFactory.newInstance();' n- c7 [( u8 f4 l: n, N* [
domFactory.setNamespaceAware(true); // never forget this4 K9 ]- ^3 [! Z5 [
DocumentBuilder builder = domFactory.newDocumentBuilder();
$ j! ~0 ]6 E7 C% I Document doc = builder.parse(new File(args[0]));
. y# X3 A& E% U. {2 X DOMSource source = new DOMSource(doc); |