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

时间:2013-08-18 16:23:10

标签: java xml xml-validation xsd-validation xbrl

我使用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”中定义,它包含在xsd之上,对应于“http://www.nltaxonomie.nl/7.0/basis/sbr/types/nl-types.xsd”中包含的“nonNegativeIntegerItemType”类型,也包含在上面的xsd中,并且扩展了“monetaryItemType”并在“http://www.xbrl.org/2003/xbrl-instance-2003-12-31.xsd”中定义,xsd也包含在上述验证中。

知道为什么我的Java验证没有报告任何错误吗?

BTW:如果我在以下位置更改上述XML代码段,它会报告错误:

<bd-burgers:CommutingExpensesAccordingToTableTotalAmount>841.0</bd-burgers:CommutingExpensesAccordingToTableTotalAmount>

即:删除所有属性。然后我得到一个正确的验证错误,说明缺少contextRef。

1 个答案:

答案 0 :(得分:0)

XBRL是XML的一个应用程序,因此,如果要将文档视为有效的XBRL文档,XBRL还需要遵循XML之外的其他规则。 XBRL文档的有效性记录在XBRL规范中,可用here。由于规则的这个“额外层”,有效的XML可能是无效的XBRL。要执行两层验证:

  1. 确保文档是有效的XML文档。
  2. 确保文档遵循XBRL规范中记录的所有XBRL验证规则。
  3. 您的Java代码只是解析XML,因此它正在执行1级验证(确保文档是有效的XML文档)。执行2级验证需要额外的代码(确保文档遵循XBRL规范中记录的所有XBRL验证规则)。

    我的理解是XMLSpy可以理解XBRL(如here所示),并且可以执行两种级别的验证。您看到的错误(数字项目既没有...... )是XBRL验证错误,XMLSpy专门针对所有已知为XBRL文档的文档进行验证。

    如果您希望验证XBRL文档的有效性,那么您将需要使用可在代码中使用的基于Java的XBRL验证引擎。如果您能够使用.NET,我可能会推荐Gepsio,可用here