2012-08-01 105 views
4

我正在使用多個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 APIjava.xml.validation documentation。它們都指定支持XMLConstants.XML_DTD_NS_URI,但在Sun的JDK 5(以及我所看到的JDK 6中)中未實現,並且我應該使用其他支持DTD驗證的庫。

我試圖在Google上搜索,但沒有找到任何東西(或者我不知道如何搜索)。我知道你可以使用DOM和TrAX來驗證DTD文檔,但這些要求你在文件系統上有DTD。我的DTD和模式位於類路徑中,所以我需要爲我的DTD自定義加載。這就是爲什麼我首先使用了javax.xml.validation.SchemaFactoryjavax.xml.validation.Schema,因爲它們提供了更大的靈活性。

所以我的問題是:是否有支持DTD驗證通過Java驗證API(XML_DTD_NS_URI),我可以使用庫(或庫)。我對不同類型的解決方案開放。

回答

0

解決方法是連接您的DTD和XML,並解析或驗證沒有.schema。舉個例子:

String dtd; 
String xml; 
.... 
.... 

src = new InputSource(new ByteArrayInputStream((dtd + xml).getBytes())); 
try { 
    factory = DocumentBuilderFactory.newInstance(); 
    factory.setValidating(true); 
    factory.setIgnoringComments(true); 
    builder = factory.newDocumentBuilder(); 
    partnersDoc = builder.parse(src); 
} catch (ParserConfigurationException ex){ 
    ex.printStackTrace(System.err); 
}