我使用多个xsd架构来验证XML文档。这是我用来做的一段代码:
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模式的加载。我写了一个实现,从classpath加载包含的文件,因为我的模式被打包在那里(不在文件系统上)
突然间,我需要切换到针对多个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
因为它们提供了更大的灵活性。
所以我的问题是:是否有一个库(或库)通过java验证API(XML_DTD_NS_URI
)支持DTD验证,我可以使用它。我愿意接受不同类型的解决方案。
答案 0 :(得分: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);
}