我正在使用多個xsd模式來驗證XML文檔。這是一段代碼,我用做:Java驗證支持DTD的API庫
public static Schema createSchemaXSD(InputStream inputXSD, LSResourceResolver resolver) throws SAXException {
SchemaFactory factory = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);
factory.setResourceResolver(resolver);
Source schemaSource = new StreamSource(inputXSD);
Schema schema = factory.newSchema(schemaSource);
return schema;
}
LSResourceResolver
是用於開發可以解決XSD架構是根模式包括在其XSD加載類接口。我寫了一個實現,它的負載包括來自類路徑的文件,因爲我的架構都擠滿那裏(不是在文件系統)
突然,我需要切換到驗證對多的DTD,所以我改變代碼:
public static Validator createValidatorDTD(InputStream inputDTD, LSResourceResolver resolver) throws SAXException {
SchemaFactory factory = SchemaFactory.newInstance(XMLConstants.XML_DTD_NS_URI);
factory.setResourceResolver(resolver);
Source schemaSource = new StreamSource(inputDTD);
Schema schema = factory.newSchema(schemaSource);
Validator validator = schema.newValidator();
return validator;
}
不幸的是,這是行不通的。它拋出一個異常上的SchemaFactory創建一個工廠:
No SchemaFactory that implements the schema language specified by: http://www.w3.org/TR/REC-xml could be loaded
我並根據文章的研究:Java XML Validation API和java.xml.validation documentation。它們都指定支持XMLConstants.XML_DTD_NS_URI
,但在Sun的JDK 5(以及我所看到的JDK 6中)中未實現,並且我應該使用其他支持DTD驗證的庫。
我試圖在Google上搜索,但沒有找到任何東西(或者我不知道如何搜索)。我知道你可以使用DOM和TrAX來驗證DTD文檔,但這些要求你在文件系統上有DTD。我的DTD和模式位於類路徑中,所以我需要爲我的DTD自定義加載。這就是爲什麼我首先使用了javax.xml.validation.SchemaFactory
和javax.xml.validation.Schema
,因爲它們提供了更大的靈活性。
所以我的問題是:是否有支持DTD驗證通過Java驗證API(XML_DTD_NS_URI
),我可以使用庫(或庫)。我對不同類型的解決方案開放。