如何判断坏模式?



我正在编写一个小应用程序来验证"候选人"。针对银行的XML文件

原来已知的好的模式文件本身也会引发问题!

我将模式文件(21个文件,我很确定这些模式中的大多数不仅引用自己,而且其中一些使用文件夹中的其他模式)加载到我的模式空间中:

// Load schemas into schema space:
Schema mySchema;
try {
SchemaFactory mySchemaFactory = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);
mySchemaFactory.setResourceResolver(new ResourceResolver(pathToSchemasFolder));
mySchema = mySchemaFactory.newSchema(primeAllSchemaDocsFromFolder(pathToSchemasFolder));
System.out.println("Schemas loaded");
} catch (SAXException e) {
throw new RuntimeException("Schema loading failed: " + e);
}

我得到:Exception in thread "main" java.lang.RuntimeException: Schema loading failed: org.xml.sax.SAXParseException; lineNumber: 232; columnNumber: 5; s4s-elt-chara...

  • 请注意,它显示了行号和列号,但没有文件名…

我已经使用自定义XsdErrorHandler()时,我验证:

// Validate xml file within schema space:
try {
Validator validator = mySchema.newValidator();
validator.setErrorHandler(new XsdErrorHandler());
validator.validate(getSingleXmlFileStreamSource(pathToXmlCandidateFile));
System.out.println("Validation is successful");

但是,在调试时,我看到这没有被调用…这是有道理的,因为失败的部分是加载模式,在我将ErrorHandler设置为Validator之前完成的事情…

我想知道是否有一种方法可以为模式加载过程设置错误处理程序?

或者你可以和我分享其他的技巧来找到违规的模式名称吗?(例如:增量地将模式文件添加到模式空间中,每次测试模式空间是否有效-没有任何无效的模式定义)

有一个SchemaFactory.setErrorHandler()方法,它允许您在模式编译期间拦截错误。

当您生成StreamSource时,您应该提供publicId属性。此属性不影响解析,但在异常中提供有用的信息:

* <p>The public identifier is always optional: if the application
* writer includes one, it will be provided as part of the
* location information.</p>

如果您使用模式文件名作为publicId,您将能够从SAXParseException中检索它。


从原始提问者编辑:由于我在newSchema()中使用Source[],因此我可以为每个Source准备输入以包含上述方法,如下所示:

Source[] sourceArray = new Source[numberOfSchemaFiles];
for (int i=0; i<numberOfSchemaFiles ; i++) {
String currentFileName = schemaFiles[i].getName();
try {
StreamSource currentStreamSource = new StreamSource(
new FileInputStream(directoryPath + currentFileName)
);
currentStreamSource.setPublicId(currentFileName);
sourceArray[i] = currentStreamSource;
} catch (FileNotFoundException e) {
throw new RuntimeException("Cannot find file: " + directoryPath + currentFileName);
}

相关内容

  • 没有找到相关文章

最新更新