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

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

顺便说一句:如果我将上面的 XML 片段更改为:

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

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

4

1 回答 1

1

XBRL 是 XML 的一种应用程序,因此,如果要将该文档视为有效的 XBRL 文档,XBRL 具有超出 XML 的附加规则,需要遵循这些规则。XBRL 文档有效性记录在 XBRL 规范中,可在此处获得。由于这个“额外层”的规则,有效的 XML 可能是无效的 XBRL。有两层验证要执行:

  1. 确保文档是有效的 XML 文档。
  2. 确保文档遵循 ​​XBRL 规范中记录的所有 XBRL 验证规则。

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

我的理解是 XMLSpy 可以理解 XBRL(如图所示,并且可以执行两个级别的验证。您看到的错误(Numeric item has both ...)是 XBRL 验证错误,XMLSpy 专门针对所有已知为 XBRL 文档的文档进行验证。

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

于 2013-08-20T20:08:03.187 回答