2010-06-07 78 views
5

我的输入是格式良好的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。

回答

0

您不会通过这种方式报告架构验证错误。如果你真的想要的行和列的信息,您需要设置一个错误处理程序,即

try { 
    validator.setErrorHandler(handler); 
    validator.validate(...); 
} catch (SAXParseException e) { 
    // Use handler info, or log it in handler 
} 

这里有您需要实现该接口:ErrorHandler

+0

我也试过了。它也对行和列返回-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

+0

您的意思是ErrorHandler中的error()和warning()方法在异常信息?这很奇怪,不应该发生..也许尝试一个不同的SAX解析器实现? – xcut 2010-06-08 07:23:28

+0

你说得对,他们不是DOM,他们是SAX。尽管有行号和列号,但我有一个通过字符流反向工作的问题,以查找失败的节点或属性。此外,列号似乎是关闭标记的结尾,我不知道每个解析器实现都可能总是如此。 – user360603 2010-06-08 15:34:21

1

DOM不保留有关它的源代码的信息 - 在大多数情况下它是无关的,并且DOM意味着被操纵(即任何位置信息都是不正确的)。

解决方案是在您解析时验证:在创建DocumentBuilder之前,请致电DocumentBuilderFactory.setSchema()