我的输入是格式良好的XML文档和相应的XML Schema文档。我想要做的是确定XML文档中的位置,导致它无法验证XML Schema文档。我无法弄清楚如何使用Java中的标准验证方法:
SchemaFactory schemaFactory = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);
Schema schema = schemaFactory.newSchema(... /* the .xsd source */);
Validator validator = schema.newValidator();
DocumentBuilderFactory ...
DocumentBuilder ...
Document document = DocumentBuilder.parse(... /* the .xml source */);
try {
validator.validate(new DOMSource(document));
...
} catch (SAXParseException e) {
...
}
我已经玩弄了至少从SAXParseException获取行号和列号的想法,但是在验证错误时它们总是设置为-1,-1。
答案 0 :(得分:1)
DOM不保留有关其来源的信息 - 在大多数情况下它是无关紧要的,并且DOM意味着被操纵(即,任何位置信息都是不正确的)。
解决方案是在您解析时进行验证:在创建DocumentBuilder
之前调用DocumentBuilderFactory.setSchema()。
答案 1 :(得分:0)
您不会以这种方式报告架构验证错误。如果您确实需要行和列信息,则需要设置错误处理程序,即
try {
validator.setErrorHandler(handler);
validator.validate(...);
} catch (SAXParseException e) {
// Use handler info, or log it in handler
}
以下是您需要实施的界面:ErrorHandler
答案 2 :(得分:0)
看看https://jaxb2-commons.dev.java.net/xpath-tracker/项目。它是为Jaxb设计的,但我认为它可以在这之外工作,因为它是一个XMLFilter。