2

我有一些 Java 代码可以针对 XSD 验证 XML。我正在使用此处找到的错误处理程序的修改版本:http ://www.ibm.com/developerworks/xml/library/x-javaxmlvalidapi.html在验证时捕获并记录所有异常。

错误非常简洁,它们看起来像这样:

http://www.w3.org/TR/xml-schema-1#cvc-complex-type.2.4.a?s:cID&{"http://www.myschema.com/schema":txn}

其他消息,例如

http://www.w3.org/TR/xml-schema-1#cvc-complex-type.2.4.a?s:attributes&{"http://www.myschema.com/schema":sequence}

更加神秘。

有没有一种简单的方法可以从 SAX 中获得清晰易懂的信息来解释这里出了什么问题?我认为在第一个错误中它是预期txn的,而是找到了 element cID。但是...我不知道 SAX 可能生成的所有可能错误,所以我宁愿不尝试手动创建转换表。

此输出的最终用户大多是非技术人员,因此我需要能够生成简单明了的消息,例如“元素txn乱序”。

如果有帮助,这里是用于验证的代码(或多或少):

Source schema1 = new StreamSource(new File("resources/schema1.xsd"));
Source schema2 = new StreamSource(new File("resources/schema2.xsd"));
Source[] sources = {schema1,schema2};
validator = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI).newSchema(sources).newValidator();
ErrorHandler lenient = new ForgivingErrorHandler();
validator.setErrorHandler(lenient);

别处...

StreamSource xmlSource = new StreamSource(new StringReader(XMLData) );
try
{
    validator.validate(xmlSource);
}
catch (SAXException e)
{
    logger.error("XML Validation Error: ",e);
}
4

1 回答 1

0

好吧,看来我不得不添加xsi:schemaLocation="http://www.mycompany.com/schema resources/schema1.xsd "到 XML 文档中,因为s:http://www.mycompany.com/schema默认命名空间是:xmlns="s:http://www.mycompany.com/schema". 当然,我无权修改生成 XML 的工具,因此需要以下丑陋的 hack:

xmlDataStr = xmlDataStr.replace("<rootNode ", "<rootNode xsi:schemaLocation=\"http://www.mycompany.com/schema resources/schema1.xsd \" ");

...当然,现在我遇到了双重验证错误!清晰易懂的,例如:

cvc-complex-type.2.4.a:发现以元素“s:cID”开头的无效内容。'{"http://www.mycompany.ca/schema":tdr}' 之一是预期的。

紧接着是:

http://www.w3.org/TR/xml-schema-1#cvc-complex-type.2.4.a?s:cID&{"http://www.mycompany.com/schema":tdr}

双重错误很烦人,但至少第一个错误是可用的......

于 2010-11-29T21:56:35.307 回答