2012-06-08 4 views
2

Проблема, которую я должен решить следующий:Обработка XML Validation Выход Программным в Java

Учитывая файл XML, который «почти проверяет» с помощью XSD (или в идеале NVDL) схемы, как я могу «привязать» файл программно?

(«Почти проверяет» означает, что некоторые элементы будут иметь атрибуты, которые они не могут иметь. Гарантируется, что не будет никаких других ошибок проверки. «Фиксация» просто означает удаление атрибута обижая.)

Я пробовал использовать документ для проверки подлинности Woodstox, но по какой-то причине он не признал бы мой XSD действительным (предоставленный, он довольно сложный с несколькими импортными и абстрактными типами, но он действителен).

Альтернативой является библиотека проверки XML, которая производит вывод. Затем я могу анализировать/обрабатывать и использовать для идентификации атрибутов, которые необходимо удалить.

Любой другой подход, который производит тот же конечный продукт, также приветствуется.

ответ

1

Если вы хотите «просто ввести в действие» атрибуты, вы можете использовать преобразование XSLT Identity для фильтрации нежелательных attrs или добавления отсутствующих attrs. Это ни в коем случае не является широкомасштабным решением проблемы, а очень хорошим решением проблемы с атрибутом.

Имейте ввиду, что порядок атрибутов может измениться после преобразования XSLT, поскольку порядок атрибутов не является обязательным свойством XML.

+0

Проблема в том, что я не знаю заранее, что такое нежелательные attrs. Или вы имеете в виду запуск XSLT с поддержкой схемы? – biziclop

+0

В этом случае вы можете сначала сначала прочитать XSD, собрать необходимые атрибуты для каждого элемента, а затем пройти дерево DOM, фиксирующее каждый узел, или запустить SAX-процессор и проверить каждый узел по мере его возникновения? –

+0

XSD слишком сложный, с абстрактными типами и все такое. Но XSLT с поддержкой схемы может работать. – biziclop

0

Это в ответ на «другой подход». Я бы предпочел изменить XSD, чтобы принять любой другой атрибут: это будет меньше накладных расходов во время выполнения, не говоря уже о всей сантехнике с XSLT.

Из-за этого звука вы знаете и как-то понимаете/контролируете XSD - вы уверены в том, что говорите «не гарантировали никаких других ошибок проверки» ... Отсюда мое предложение.

Проблема может заключаться в том, как изменить XSD, если он является «внешним». Если вы можете подробнее рассказать о том, как XSD будет использоваться для вашей обработки, могут появиться лучшие предложения ...

Возможно, вы все еще в конечном итоге получаете XSLT, преобразующий XSD в XSD; это все равно будет лучше в среде с производительностью, так как вам нужно будет сделать это один раз для все XML, а не один раз для каждый XML.

+0

К сожалению, XSD находится вне моего контроля и даже не известен во время компиляции. Я знаю, что было бы намного проще изменить сам XSD, я бы сделал это, если мог. – biziclop

+0

... тогда вы не должны требовать «гарантированного»:) .... Очевидно, тогда даже «статический» - известный «во время компиляции» - XSLT не сработает ... Вы попадаете в то, что я называю " экран версии ", автоматически созданный артефакт (XSLT, Java, .NET), который отвечает за очистку данных XML в соответствии с XSD, прежде чем достигнет XSD-совместимого и совместимого XML-процессора. –

+0

Я утверждаю, что это гарантировано, потому что это так. Я могу проверить исходную версию документа, который затем проходит процесс, который добавляет некоторые атрибуты (но он добавляет больше, чем должен). Хотя этот процесс тоже не в моих силах, я могу разграничить две версии, чтобы доказать, что он делает то, что он говорит на жестяной банке. Так что довольно круто, но могу сказать, что это гарантировано. – biziclop

1

Проанализируйте свой XML с помощью обработчика ошибок, который фиксирует обнаруженные ошибки «дополнительного атрибута» в объектах командной строки типа «удалить этот атрибут».

Тогда это вопрос реализации, если вы проскользнули эти объекты между «синтаксическим анализатором SAX» и «записью с использованием SAX», или если вы запустили их в дереве DOM, прежде чем переписывать дерево DOM в XML.

Обработчик ошибок должен обрабатывать эту ошибку, и если вы не собираетесь считать ее ошибкой, обработчик ошибок не должен прекращать разбор. Это даст вам прекрасный контроль зерна, только ценой написания кода, чтобы зафиксировать позицию атрибута в документе (и сделать что-то с ним позже).

Согласно XML spec, ограничения на достоверность - это только «ошибки», которые открывают дверь для продолжения обработки, при условии, что ваш обработчик ошибок не останавливает игру. См. Раздел 1.2 для подробностей, указывающих, что это не должна быть невосстановимой ошибкой, а это значит, что решение для захвата и исправления должно быть возможно.