翻译SAX异常

时间:2010-11-26 20:15:19

标签: java sax xml-validation

我有一些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而是找到元素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);
}

1 个答案:

答案 0 :(得分: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的工具,因此需要以下丑陋的黑客攻击:

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

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

cvc-complex-type.2.4.a: Invalid content was found starting with element 's:cID'. One of '{"http://www.mycompany.ca/schema":tdr}' is expected.

紧接着是:

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

双重错误令人讨厌,但至少第一个错误是可用的......