Вы правы, Кастор ожидает статического отображения. Но с этим можно работать. Вы можете написать некоторый код, который изменит входящий xml, чтобы 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 демаршаллеру Castor.
С XSLT не получится обмануть SAX, хотя XSLT иногда имеет репутацию болезненного, мне кажется, что это может быть относительно прямолинейное преобразование, но я также не пробовал его. Прошло много времени с тех пор, как я использовал XSLT для чего-либо. Я также не уверен в производительности, хотя я бы не стал списывать это со счетов.
Использование XOM, JDOM или DOM4J для переноса XML также возможно, и кривая обучения намного ниже, чем для SAX или XSLT. Недостатком является то, что весь XML-документ имеет тенденцию всасываться в память сразу, поэтому, если вы имеете дело с достаточно большими документами, у вас может не хватить памяти.
person
Nathan Hughes
schedule
24.11.2009