У меня есть схема, определяющая запись event , которая используется для передачи сообщения между двумя системами в сценарии публикации / подписки. Событие включает в себя элемент «payload», event_data , с подробностями сообщения. Сложность состоит в том, что полезная нагрузка может быть любого из 30+ типов , каждый из которых определен в своем собственном XSD.
Например (урезанный):
<event>
<event_name>new_phone_number</event_name>
<event_data>
<areacode>303</areacode>
<number>555-1212</number>
<extension>31</extension>
</event_data>
</event>
В этом случае event_data имеет тип phone_number , который определен в другом месте в импортированном XSD. Но я хочу использовать тот же механизм для переноса других видов структурированных данных сообщений. Например, может быть, это событие смены работы, определяемое как тип job_details :
<event>
<event_name>new_job</event_name>
<event_data>
<job_title>CEO</job_title>
<start_date>01/01/2012</start_date>
<location>Main Office</location>
</event_data>
</event>
Внутренняя запись, хранящаяся в элементе event_data , имеет тип job_details , как определено в импортированном XSD. «Внешняя» запись типа event - это не более чем способ переноса полезной нагрузки, содержащейся во «внутренней» записи.
До сих пор я рассмотрел три способа атаки, каждый с проблемами:
Используйте конструкцию выбора, в которой перечислены все возможные типы записей. Кажется, проблема в том, что xml / xsd не является естественным, когда все записи в списке выбора имеют одинаковое имя элемента.
Полагаю, что вместо того, чтобы пытаться включить структурированную подзапись в элемент event_data , я мог бы просто иметь необязательный атрибут, отражающий все возможные типы подзаписей. Конечно, у каждого будет уникальное имя, поэтому у вас будет атрибут для new_phone_number , для new_job и т. Д. Помимо потенциальных проблем с обслуживаемостью и уродством, я не уверен, как я мог бы обеспечить, чтобы один и только один из атрибутов передавался в данном экземпляре события. Я мог бы жить с этим, но это делает код хрупким.
Кто-то ответил на аналогичный вопрос, предложив использовать объединение - но, похоже, это применимо только к простым типам. Не будет охватывать мой случай использования.
Тупик! Любое руководство?