我正在使用Xerces验证Java中的XML文档,但不会出现任何错误 .
但是,XML文档包含错误,当我使用例如XMLSply编辑器对其进行验证时,会正确报告错误 .
我找不到我做错了什么 . 我想我确实包含了正确验证所需的所有XSD架构 .
请一些建议?代码段:
SchemaFactory factory = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);
factory.setErrorHandler(new ErrorHandlerDefault());
Schema schema = factory.newSchema(createSchemaSources());
validator = schema.newValidator().validate("file.xml");
我用来验证的XSD:
private Source[] createSchemaSources() throws IOException {
Source[] sources = new Source[5];
sources[0] = createSource("http://www.nltaxonomie.nl/7.0/domein/bd/tuples/bd-bedr-tuples.xsd");
sources[1] = createSource("http://www.nltaxonomie.nl/7.0/basis/bd/items/bd-burgers.xsd");
sources[2] = createSource("http://www.nltaxonomie.nl/7.0/domein/bd/tuples/bd-burg-tuples.xsd");
sources[3] = createSource("http://www.nltaxonomie.nl/7.0/basis/sbr/types/nl-types.xsd");
sources[4] = createSource("http://www.xbrl.org/2003/xbrl-instance-2003-12-31.xsd");
return sources;
}
正在验证的xml文件的一小段(太大而无法列出所有内容):
<bd-burgers:CommutingExpensesDaysPerWeekCount unitRef="uu_513" contextRef="cc_711">2</bd-burgers:CommutingExpensesDaysPerWeekCount>
此条目包含错误,即:
Numeric item <bd-burgers:CommutingExpensesDaysPerWeekCount> has neither a 'precision' nor a 'decimals' attribute.
这是由XMLSpy正确报告的,但不是由我的Java代码报告:( ...那么我在这里做错了什么?我虽然忘记了一个XSD文件,但"CommutingExpensesDaysPerWeekCount"在“http://www.nltaxonomie.nl/7.0/basis/bd/items/bd-burgers.xsd ", that is contained int he above xsd's, that corresponds to the type " nonNegativeIntegerItemType " contained in " http://www.nltaxonomie.nl/7.0/basis/sbr/types/nl-types.xsd ", also contained in the xsd's above, and that extends "currencyItemType " and is defined in " http://www.xbrl.org/2003/xbrl-instance-2003-12-31.xsd”中定义,xsd也包含在上述验证中 .
知道为什么我的Java验证没有报告任何错误吗?
顺便说一句:如果我更改上面的XML片段,它会报告错误:
<bd-burgers:CommutingExpensesAccordingToTableTotalAmount>841.0</bd-burgers:CommutingExpensesAccordingToTableTotalAmount>
即:删除所有属性 . 然后我得到一个正确的验证错误,说缺少contextRef .
1 回答
XBRL是XML的一个应用程序,因此,如果要将文档视为有效的XBRL文档,XBRL还需要遵循XML之外的其他规则 . XBRL文档的有效性记录在XBRL规范中,可用here . 由于这个"extra layer"规则,有效的XML可能是无效的XBRL . 要执行两层验证:
确保文档是有效的XML文档 .
确保该文档遵循XBRL规范中记录的所有XBRL验证规则 .
您的Java代码只是解析XML,因此它正在执行1级验证(确保文档是有效的XML文档) . 执行2级验证需要额外的代码(确保文档遵循XBRL规范中记录的所有XBRL验证规则) .
我的理解是XMLSpy可以理解XBRL(如here所示),并且可以执行两种级别的验证 . 您看到的错误(数字项目既没有......)是XBRL验证错误,XMLSpy专门针对所有已知为XBRL文档的文档进行验证 .
如果您希望验证XBRL文档的有效性,那么您将需要使用可在代码中使用的基于Java的XBRL验证引擎 . 如果你能够使用.NET,我可能会推荐Gepsio,可用here .