我有一些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);
}
答案 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}
双重错误令人讨厌,但至少第一个错误是可用的......