首页 文章

针对许多XSD的错误XML文档的XML验证不报告Java中的任何错误?

提问于
浏览
0

我正在使用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 回答

  • 0

    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 .

相关问题