我试图理解验证 XSD 文件本身和根据 XSD 架构验证 XML 之间的区别。我看到有两个概念,但我不知道在我的情况下应该使用哪一个。
假设我想在解析从远程服务器收到的 XML 文件之前验证 XSD 文件。
它应该看起来或多或少像这样:
if (validateXsdSchema(contentBytes.inputStream())) {
fileVerifcation = xmlParser.parse(contentBytes.inputStream())
}
在解析之前,我添加了一个 if 检查,其中应进行 XSD 验证。如果成功则执行解析,否则不执行。
我有一个具有可用结构的 XSD 文件,每个 XML 文件都来自远程服务器。我的第一个问题是:XSD 验证总是需要 XML 文件(它在此类验证中扮演什么角色?)或者 XSD 文件是否足够?
我有两个函数
validateXsdSchema
,但我真的不知道应该使用哪一个来执行此类 XSD 验证。
1.
@Throws(SAXException::class, IOException::class)
private fun validateXsdSchema(content: InputStream): Boolean {
try {
val validator = createXsdSchemaValidator()
val xmlFile: Source = StreamSource(content)
validator.validate(xmlFile)
return true
} catch (exception: SAXException) {
return false
}
}
@Throws(SAXException::class)
private fun createXsdSchemaValidator(): Validator {
val schemaFactory = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI)
val schemaSource: Source = StreamSource(
javaClass.classLoader
.getResourceAsStream(SCHEMA_XSD_FILENAME)
)
val schema = schemaFactory.newSchema(schemaSource)
val validator = schema.newValidator()
return validator
}
2.
public static boolean validate(String xml) {
SchemaFactory factory = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);
try {
File schemaFile = ResourceUtils.getFile("SCHEMA_XSD_FILENAME");
Schema schema = factory.newSchema(schemaFile);
Validator validator = schema.newValidator();
Source source = new StreamSource(new StringReader(xml));
validator.validate(source);
} catch (IOException | SAXException e) {
log.error(e.getMessage());
return false;
}
return true;
}
也许还有另一种方法来验证 XSD 文件? 预先感谢您的解释。
验证 XSD 文件将检查 XML 架构定义 (XSD) 是否正确且未引用未知对象以及结构是否正常。
通常,您使用在线验证器或尝试从 XSD 生成代码模型时执行此步骤(例如用于稍后解析的 java 源文件)
当您从远程服务器接收 XML 时,在解组/解析方法中添加架构将允许解组器根据 XSD 文件检查 XML,因此如果 XML 根据 XSD 不正确(缺少强制属性/元素...)
根据您对上下文的解释,我猜想您只对用于解析远程输入的 XSD 文件的 XML 验证感兴趣,并确保根据架构定义它没有任何解析错误。