【发布时间】:2021-03-12 11:03:55
【问题描述】:
目前我参与了一个项目,其中我必须验证 XML 文件。这些文件将由用户通过使用 Spring 框架用 Java 编写的 REST API 上传。模式文件位于 XML 文件 [2] 中的 URL[1] 作为属性“schemaLocation”。 XSD 文件也可能包含多个其他模式文件。用户上传的文件是 IO-Link 设备描述 (IODD) 文件。
所以,我当前的问题是在主架构中加载包含的验证方案。下载模式并使用它们进行验证不是我的目标。整个过程必须是动态的。我也不想使用 IO-Link 本身提供的 IODDChecker。
我读到这可以通过 ResourceResolver 接口完成,但我找不到任何实现来通过 URL 或类似的方式从主架构加载包含的架构。
那么,你能帮我找到解决这个问题的方法吗?
提前谢谢你!
这是验证文件的方法:
public boolean isValid(String file) {
if (file == null || file.isEmpty() || !Files.exists(Path.of(file)) || !Files.isReadable(Path.of(file)))
return false;
else if (this.getStamp() == null || this.getStamp().getChecker() == null)
return false;
else if (this.getStamp().getCrc().isEmpty())
return false;
try {
SchemaFactory factory = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);
factory.setErrorHandler(new LineNumberErrorHandler());
Schema schema = factory.newSchema(XsdReceiver.receive(this.schemaLocation));
Validator validator = schema.newValidator();
//validator.validate(new StreamSource(new ByteArrayInputStream(data)));
validator.setResourceResolver(factory.getResourceResolver());
validator.validate(new StreamSource(new File(file)));
} catch (Exception e) {
return false;
}
return true;
}
这是模式接收器方法。它可以工作,但是当架构包含时,验证过程就会失败。 (此代码下方的错误消息。
public static Source receive(String url) {
url = url.contains(" ") ? url.replace(" ", "/") : url;
try {
URL u = new URL(url);
HttpURLConnection c = (HttpURLConnection)u.openConnection();
int status = c.getResponseCode();
if (status == HttpURLConnection.HTTP_MOVED_TEMP
|| status == HttpURLConnection.HTTP_MOVED_PERM
|| status == HttpURLConnection.HTTP_SEE_OTHER
)
c = (HttpURLConnection) new URL(c.getHeaderField("Location")).openConnection();
return new StreamSource(c.getInputStream());
} catch (IOException e) {
e.printStackTrace();
}
return null;
}
我从验证器收到的错误消息。
Line: 3) schema_reference.4: Failed to read schema document 'IODD-Primitives1.1.xsd', because 1) could not find the document; 2) the document could not be read; 3) the root element of the document is not <xsd:schema>.
Line: 4) schema_reference.4: Failed to read schema document 'IODD-Datatypes1.1.xsd', because 1) could not find the document; 2) the document could not be read; 3) the root element of the document is not <xsd:schema>.
Line: 5) schema_reference.4: Failed to read schema document 'IODD-Variables1.1.xsd', because 1) could not find the document; 2) the document could not be read; 3) the root element of the document is not <xsd:schema>.
Line: 6) schema_reference.4: Failed to read schema document 'IODD-Events1.1.xsd', because 1) could not find the document; 2) the document could not be read; 3) the root element of the document is not <xsd:schema>.
Line: 7) schema_reference.4: Failed to read schema document 'IODD-UserInterface1.1.xsd', because 1) could not find the document; 2) the document could not be read; 3) the root element of the document is not <xsd:schema>.
Line: 8) schema_reference.4: Failed to read schema document 'IODD-Communication1.1.xsd', because 1) could not find the document; 2) the document could not be read; 3) the root element of the document is not <xsd:schema>.
Line: 180) src-resolve: Cannot resolve the name 'DeviceIdT' to a(n) 'type definition' component.
Line: 180) src-resolve: Cannot resolve the name 'DeviceIdT' to a(n) 'simpleType definition' component.
Line: 191) src-resolve: Cannot resolve the name 'DeviceIdT' to a(n) 'type definition' component.
Line: 228) src-resolve: Cannot resolve the name 'CollectionT' to a(n) 'type definition' component.
Line: 292) src-resolve: Cannot resolve the name 'ObjectT' to a(n) 'type definition' component.
Line: 303) src-resolve: Cannot resolve the name 'CollectionT' to a(n) 'type definition' component.
Line: 312) src-resolve: Cannot resolve the name 'DataItemT' to a(n) 'type definition' component.
Line: 12) src-resolve: Cannot resolve the name 'DocumentInfoT' to a(n) 'type definition' component.
Line: 15) src-resolve: Cannot resolve the name 'CommNetworkProfileT' to a(n) 'type definition' component.
Line: 16) src-resolve: Cannot resolve the name 'ExternalTextCollectionT' to a(n) 'type definition' component.
Line: 22) src-resolve: Cannot resolve the name 'StampT' to a(n) 'type definition' component.
Line: 152) src-resolve: Cannot resolve the name 'TextRefT' to a(n) 'type definition' component.
Line: 153) src-resolve: Cannot resolve the name 'TextRefT' to a(n) 'type definition' component.
Line: 168) src-resolve: Cannot resolve the name 'TextRefT' to a(n) 'type definition' component.
Line: 169) src-resolve: Cannot resolve the name 'TextRefT' to a(n) 'type definition' component.
Line: 195) src-resolve: Cannot resolve the name 'TextRefT' to a(n) 'type definition' component.
Line: 196) src-resolve: Cannot resolve the name 'TextRefT' to a(n) 'type definition' component.
Line: 238) src-resolve: Cannot resolve the name 'DatatypeCollectionT' to a(n) 'type definition' component.
Line: 239) src-resolve: Cannot resolve the name 'VariableCollectionT' to a(n) 'type definition' component.
Line: 250) src-resolve: Cannot resolve the name 'ErrorTypeCollectionT' to a(n) 'type definition' component.
Line: 257) src-resolve: Cannot resolve the name 'EventCollectionT' to a(n) 'type definition' component.
Line: 263) src-resolve: Cannot resolve the name 'UserInterfaceT' to a(n) 'type definition' component.
[1]https://www.io-link.com/IODD/2010/10/IODD1.1.xsd
[2]https://ioddfinder.io-link.com/productvariants/search/11765(以 IO-Link 产品 TV7105 为例)
【问题讨论】:
标签: java xml validation xsd