Вы правы, Кастор ожидает статического отображения. Но вы можете работать с этим. Вы можете написать код, который изменит входящий XML-код, чтобы на вашей стороне Castor мог использовать одну схему, а на стороне ваших клиентов они не должны менять свои схемы.
Измените схему, которую Castor ожидает получить от чего-то с помощью обычного корневого элемента, при этом ваши девять различных альтернатив для ваших разных объектов (я думаю, вы можете ограничить его, чтобы схема позволяла использовать только одну из девяти, если это не сработает, вы можете просто сделать все вспомогательные элементы дополнительными).
Затем вы можете написать код, который изменяет входящий xml, чтобы обернуть ваш входящий xml с помощью этого общего корневого элемента, а затем передал обернутый xml в поток, который считывается с помощью расклассификатора Castor.
Существует как минимум 3 различных способа реализации части, содержащей XML-фрагмент: библиотеки SAX, XSLT и XML (такие как JDOM, DOM4J и XOM - я предпочитаю XOM, но любой из них будет работать).
Способ SAX, вероятно, лучше всего, если вы уже знакомы с SAX или если один из других способов сработал, но при этом не хватает производительности. Если бы мне пришлось реализовать это, я бы создал XMLFilter, который принимает xml и записывает xml, складывая его поверх другой части, которая записывает xml в OutputStream, и записывает метод обертки вокруг неуправляемого материала для подачи входящего потока на xmlreader, скопируйте OutputStream в другой InputStream (простой способ - использовать commons-io) и загрузите новый InputStream в unmarshaller Castor.
С XSLT нет дураков с SAX, хотя иногда XSLT имеет репутацию боли, мне кажется, что это может быть относительно простой трансформацией, но я тоже не принял удар. Я давно не использовал XSLT. Я тоже не уверен в производительности, хотя я бы не отказался от этого.
Использование XOM или JDOM или DOM4J для обертывания XML также возможно, а кривая обучения намного ниже, чем для SAX или XSLT. Недостатком является то, что весь XML-документ, как правило, всасывается в память сразу, поэтому, если вы имеете дело с достаточно большими документами, у вас может закончиться нехватка памяти.
Никто? Это разочаровывает. – Dave
Это не то, что мне не нравится ваш комментарий, просто он не отвечает на конкретную проблему. Я не хочу иметь ни одного корневого элемента в моей схеме, а затем передавать один гигантский объект для каждого вызова метода. – Dave
Я не думаю, что вам придется пройти вокруг гигантского объекта. Вам нужно будет пройти через диаграмму unmarshalled object и найти то, что на самом деле получилось, и вернуть это. Рад слышать, что у вас есть решение. –