我使用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。
答案 0 :(得分:0)
XBRL是XML的一个应用程序,因此,如果要将文档视为有效的XBRL文档,XBRL还需要遵循XML之外的其他规则。 XBRL文档的有效性记录在XBRL规范中,可用here。由于规则的这个“额外层”,有效的XML可能是无效的XBRL。要执行两层验证:
您的Java代码只是解析XML,因此它正在执行1级验证(确保文档是有效的XML文档)。执行2级验证需要额外的代码(确保文档遵循XBRL规范中记录的所有XBRL验证规则)。
我的理解是XMLSpy可以理解XBRL(如here所示),并且可以执行两种级别的验证。您看到的错误(数字项目既没有...... )是XBRL验证错误,XMLSpy专门针对所有已知为XBRL文档的文档进行验证。
如果您希望验证XBRL文档的有效性,那么您将需要使用可在代码中使用的基于Java的XBRL验证引擎。如果您能够使用.NET,我可能会推荐Gepsio,可用here。