catch (SAXException ex) {
System.out.println(input + " is not valid because ");
System.out.println(ex.getMessage());
}
}
}
如果用普通的 Sun JDK 不增加其他庫,運行該程序時可能會看到如下所示的結(jié)果:
Exception in thread "main" java.lang.IllegalArgumentException:
http://relaxng.org/ns/structure/1.0
at javax.xml.validation.SchemaFactory.newInstance(SchemaFactory.java:186)
at DocbookRELAXNGCheck.main(DocbookRELAXNGCheck.java:14)
這是因為,JDK 本身沒有帶 RELAX NG 驗證程序。如果不能識別模式語言,SchemaFactory.newInstance() 就會拋出 IllegalArgumentException。但是如果安裝了 RELAX NG 庫,比如 Jing 和 JAXP 1.3 適配程序,就會與 W3C 模式顯示同樣的結(jié)果。
確定模式語言
javax.xml.constants 類定義了幾個常量來標(biāo)識模式語言:
XMLConstants.W3C_XML_SCHEMA_NS_URI:http://www.w3.org/2001/XMLSchema
XMLConstants.RELAXNG_NS_URI:http://relaxng.org/ns/structure/1.0
XMLConstants.XML_DTD_NS_URI:http://www.w3.org/TR/REC-xml
這是一個不完全的列表。實現(xiàn)可以隨時向該表增加其他 URL 來標(biāo)識其他的模式語言。URL 通常是模式語言的名稱空間統(tǒng)一資源標(biāo)識符(URI)。比如,URL http://www.ascc.net/xml/schematron 標(biāo)識了 Schematron 模式。
Sun 的 JDK 5 僅支持 XSD 模式。雖然也支持 DTD 驗證,但是它不能通過 javax.xml.validation API 使用。對于 DTD,必須使用常規(guī)的 SAX XMLReader 類。不過可以另外安裝支持不同模式語言的其他庫。
如何定位模式工廠
Java 編程語言沒有限制模式工廠只能有一種?梢园褬(biāo)識某種模式語言的 URI 傳遞給 SchemaFactory.newInstance(),它按照下列順序搜索匹配的工廠:
用 "javax.xml.validation.SchemaFactory:schemaURL" 系統(tǒng)屬性命名的類
用 $java.home/lib/jaxp.properties 文件中的 "javax.xml.validation.SchemaFactory:schemaURL" 屬性命名的類
在任何 Java Archive (JAR) 文件的 META-INF/services 目錄中發(fā)現(xiàn)的 javax.xml.validation.SchemaFactory 服務(wù)提供程序
平臺默認的 SchemaFactory,JDK 5 中為 com.sun.org.apache.xerces.internal.jaxp.validation.xs.SchemaFactoryImpl
要支持自定義的模式語言和對應(yīng)的驗證程序,只需要編寫 SchemaFactory、Schema 和 Validator(它們知道如何處理模式語言)的子類。然后將您的 JAR 文件安裝到上述四個位置中的一個。對于添加與 W3C XML Schema 語言這類聲明性語言相比更適合用 Java 之類的圖靈完整語言檢查的約束,這一點很重要。可以定義一種微模式語言,編寫簡單的實現(xiàn),然后將其插入到驗證層。
相關(guān)推薦:北京 | 天津 | 上海 | 江蘇 | 山東 |
安徽 | 浙江 | 江西 | 福建 | 深圳 |
廣東 | 河北 | 湖南 | 廣西 | 河南 |
海南 | 湖北 | 四川 | 重慶 | 云南 |
貴州 | 西藏 | 新疆 | 陜西 | 山西 |
寧夏 | 甘肅 | 青海 | 遼寧 | 吉林 |
黑龍江 | 內(nèi)蒙古 |