catch (SAXException ex) {
System.out.println(input + " is not valid because ");
System.out.println(ex.getMessage());
}
}
}
如果用普通的 Sun JDK 不增加其他庫(kù),運(yùn)行該程序時(shí)可能會(huì)看到如下所示的結(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)
這是因?yàn),JDK 本身沒(méi)有帶 RELAX NG 驗(yàn)證程序。如果不能識(shí)別模式語(yǔ)言,SchemaFactory.newInstance() 就會(huì)拋出 IllegalArgumentException。但是如果安裝了 RELAX NG 庫(kù),比如 Jing 和 JAXP 1.3 適配程序,就會(huì)與 W3C 模式顯示同樣的結(jié)果。
確定模式語(yǔ)言
javax.xml.constants 類定義了幾個(gè)常量來(lái)標(biāo)識(shí)模式語(yǔ)言:
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
這是一個(gè)不完全的列表。實(shí)現(xiàn)可以隨時(shí)向該表增加其他 URL 來(lái)標(biāo)識(shí)其他的模式語(yǔ)言。URL 通常是模式語(yǔ)言的名稱空間統(tǒng)一資源標(biāo)識(shí)符(URI)。比如,URL http://www.ascc.net/xml/schematron 標(biāo)識(shí)了 Schematron 模式。
Sun 的 JDK 5 僅支持 XSD 模式。雖然也支持 DTD 驗(yàn)證,但是它不能通過(guò) javax.xml.validation API 使用。對(duì)于 DTD,必須使用常規(guī)的 SAX XMLReader 類。不過(guò)可以另外安裝支持不同模式語(yǔ)言的其他庫(kù)。
如何定位模式工廠
Java 編程語(yǔ)言沒(méi)有限制模式工廠只能有一種?梢园褬(biāo)識(shí)某種模式語(yǔ)言的 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ù)提供程序
平臺(tái)默認(rèn)的 SchemaFactory,JDK 5 中為 com.sun.org.apache.xerces.internal.jaxp.validation.xs.SchemaFactoryImpl
要支持自定義的模式語(yǔ)言和對(duì)應(yīng)的驗(yàn)證程序,只需要編寫(xiě) SchemaFactory、Schema 和 Validator(它們知道如何處理模式語(yǔ)言)的子類。然后將您的 JAR 文件安裝到上述四個(gè)位置中的一個(gè)。對(duì)于添加與 W3C XML Schema 語(yǔ)言這類聲明性語(yǔ)言相比更適合用 Java 之類的圖靈完整語(yǔ)言檢查的約束,這一點(diǎn)很重要?梢远x一種微模式語(yǔ)言,編寫(xiě)簡(jiǎn)單的實(shí)現(xiàn),然后將其插入到驗(yàn)證層。
相關(guān)推薦:計(jì)算機(jī)等級(jí)考試二級(jí)Java經(jīng)典算法大全匯總
北京 | 天津 | 上海 | 江蘇 | 山東 |
安徽 | 浙江 | 江西 | 福建 | 深圳 |
廣東 | 河北 | 湖南 | 廣西 | 河南 |
海南 | 湖北 | 四川 | 重慶 | 云南 |
貴州 | 西藏 | 新疆 | 陜西 | 山西 |
寧夏 | 甘肅 | 青海 | 遼寧 | 吉林 |
黑龍江 | 內(nèi)蒙古 |