Проверка XML на множество XSD неправильного XML-документа не сообщает об ошибках в Java?

Я проверяю XML-документ на Java с помощью Xerces, но не получаю никаких ошибок.

Однако документ 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, что соответствует типу "nonNegativeIntegerItemType", содержащемуся в "http://www.nltaxonomie.nl/7.0/basis/sbr/types/nl-types.xsd", также содержится в xsd выше и расширяет " moneyItemType" и определяется в "http://www.xbrl.org/2003/xbrl-instance-2003-12-31.xsd", который xsd также содержится в приведенной выше проверке.

Любая идея, почему моя проверка Java не сообщает об ошибках?

Кстати: он сообщает об ошибке, если я изменяю приведенный выше фрагмент XML в:

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

То есть: удаление всех атрибутов. Затем я получаю правильную ошибку проверки, говорящую о том, что contextRef отсутствует.


person edbras    schedule 18.08.2013    source источник


Ответы (1)


XBRL является приложением XML, и, таким образом, XBRL имеет дополнительные правила помимо XML, которым необходимо следовать, если документ считается действительным документом XBRL. Действительность документа XBRL задокументирована в спецификации XBRL, доступной здесь. Из-за этого «дополнительного слоя» правил действительный XML может быть недействительным XBRL. Необходимо выполнить два уровня проверки:

  1. Убедитесь, что документ является допустимым XML-документом.
  2. Убедитесь, что документ соответствует всем правилам проверки XBRL, как указано в спецификации XBRL.

Ваш код Java просто анализирует XML, поэтому он выполняет проверку уровня 1 (Убедитесь, что документ является допустимым документом XML). Для выполнения проверки уровня 2 требуется дополнительный код (Убедитесь, что документ соответствует всем правилам проверки XBRL, как указано в спецификации XBRL).

Насколько я понимаю, XMLSpy может понимать XBRL (как показано здесь) и может выполнять оба уровня проверки. Ошибка, которую вы видите (Числовой элемент не имеет ни ...), является ошибкой проверки XBRL, которую XMLSpy специально проверяет на соответствие всем документам, известным как документы XBRL.

Если вы надеетесь проверить документ XBRL на достоверность, вам потребуется использовать механизм проверки XBRL на основе Java, который вы можете использовать в своем коде. Если вы можете использовать .NET, я могу порекомендовать Gepsio, доступный здесь.

person JeffFerguson    schedule 20.08.2013
comment
Спасибо. Мне известны различные этапы/уровни проверки XBRl, такие как FRIS, бизнес-ограничения и т. д. Однако я думаю, что ошибка является обычной ошибкой проверки XSD (как я делаю), почему вы думаете, что это конкретный XBRL Проверка? Я также получаю такие ошибки при выполнении обычной проверки XSD? Я не могу использовать Gespsio, но планировал в будущем подать в суд на UBMatrix (или его часть) и использовать их обнаружение и проверку DTS. Однако я надеюсь, что в ближайшем будущем появятся лучшие проекты с открытым исходным кодом для проверки XBRL и обнаружения DTS. - person edbras; 21.08.2013