【发布时间】:2016-05-15 06:39:24
【问题描述】:
在标准 java 环境中针对 xsd 模式验证 xml 源时,我无法找到一种方法来获取有关未通过验证的元素的信息(在许多特定情况下)。
当捕获 SAXParseException 时,元素的信息消失了。但是,当调试到 xerces.XmlSchemaValidator 时,我可以看到原因是特定的错误消息未定义为提供有关元素的信息。
例如(在我的 java 演示中也是如此)“cvc-mininclusive-valid”错误是这样定义的: cvc-minInclusive-valid:值 ''{0}'' 对于类型 ''{2}'' 的 minInclusive ''{1}'' 不是 facet-valid。 https://wiki.xmldation.com/Support/Validator/cvc-mininclusive-valid
我更喜欢的是,会产生这种消息: cvc-type.3.1.3:元素“{0}”的值“{1}”无效。 https://wiki.xmldation.com/Support/Validator/cvc-type-3-1-3
当调试到 xerces.XMLSchemaValidator 时,我可以看到有两个连续调用 reportSchemaError(...) - 如果第一个确实返回而没有引发异常,则仅发生第二个。
有没有办法配置验证器以使用第二种报告方式或使用元素信息丰富 SAXParseException?
请查看我的复制&粘贴&运行示例下面的代码以获得进一步的解释:
String xsd =
"<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n" +
"<xs:schema xmlns:xs=\"http://www.w3.org/2001/XMLSchema\" version=\"1.0\">" +
"<xs:element name=\"demo\">" +
"<xs:complexType>" +
"<xs:sequence>" +
// given are two elements that cannot be < 1
"<xs:element name=\"foo\" type=\"xs:positiveInteger\" minOccurs=\"0\" maxOccurs=\"unbounded\" />" +
"<xs:element name=\"bar\" type=\"xs:positiveInteger\" minOccurs=\"0\" maxOccurs=\"unbounded\" />" +
"</xs:sequence>" +
"</xs:complexType>" +
"</xs:element>" +
"</xs:schema>";
String xml =
"<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" +
"<demo>" +
"<foo>1</foo>" +
// invalid!
"<foo>0</foo>" +
"<bar>2</bar>" +
"</demo>";
Validator validator = SchemaFactory
.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI)
.newSchema(new StreamSource(new StringReader(xsd)))
.newValidator();
try {
validator.validate(new StreamSource(new StringReader(xml)));
} catch (SAXParseException e) {
// unfortunately no element or line/column info:
System.err.println(e.getMessage());
// better, but still no element info:
System.err.println(String.format("Line %s - Column %s - %s",
e.getLineNumber(),
e.getColumnNumber(),
e.getMessage()));
}
【问题讨论】:
-
不幸的是,我认为这是不可能的。如果您必须拥有元素名称,则可以编写自己的代码来根据该行号和列号来定位元素名称,但即便如此,我也不认为这些总是可靠的。跨度>
-
感谢@Matthew 的评论!我会给我的问题多一点时间,直到我失去希望,你是对的:)
标签: java xml sax saxparser xerces