我的输入是格式良好的XML文档和相应的XML Schema文档。我想要做的是确定XML文档中导致XML文档无法验证的位置。我无法弄清楚如何使用标准的验证方法在Java中做到这一点:以编程方式确定XML文档中的哪个节点导致对其XML Schema进行验证失败
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。
我也试过了。它也对行和列返回-1: 错误异常:cvc-complex-type.3.2.2:属性'xsi:noNamespaceSchemaLocation'不允许出现在元素'shiporder'中,行:-1,列: -1 错误异常:cvc-datatype-valid.1.2.1:'asdf9.90'对'decimal'不是有效值。,行:-1,列:-1 错误异常:cvc-type.3.1 .3:元素'price'的值'asdf9.90'无效,行:-1,列:-1 – user360603 2010-06-07 21:24:36
您的意思是ErrorHandler中的error()和warning()方法在异常信息?这很奇怪,不应该发生..也许尝试一个不同的SAX解析器实现? – xcut 2010-06-08 07:23:28
你说得对,他们不是DOM,他们是SAX。尽管有行号和列号,但我有一个通过字符流反向工作的问题,以查找失败的节点或属性。此外,列号似乎是关闭标记的结尾,我不知道每个解析器实现都可能总是如此。 – user360603 2010-06-08 15:34:21