Проходят годы, но эта схема продолжает беспокоить людей! Последние несколько дней я боролся с тем же XSD (HL7), особенно за обработку смешанных типов элементов контента.
Мое первоначальное требование было противоположно исходному постеру, так как мне нужно было написать простой текст внутри смешанного элемента. Но я также должен иметь возможность читать такой контент, поэтому я применил то же решение, которое было предложено в другом ответе, а именно: создание собственного файла привязки и его использование в мастере Eclipse «JAXB Classes from Schema».
В этом случае вы можете указать, какие файлы привязки использовать в одном из диалоговых окон мастера.
В результате классы создаются с содержимым List<Serializable>
всякий раз, когда обнаруживается смешанный тип элемента. Получить некоторую информацию, которая вам действительно нужна, немного сложнее, но, по крайней мере, вы уверены, что можете программно получить доступ ко всему, что присутствует в файле XML, придерживающемся этого XSD.
Вы даже можете перейти к более сложному смешанному содержимому, например:
<v3:name>
<v3:given>Sample Given Name</v3:given>
<v3:family>Sample Family Name</v3:family>
</v3:name>
Где name
определено как таковое (я удалил содержимое, не пригодное для этого примера, из исходного XSD):
<xs:complexType name="EN" mixed="true">
<xs:complexContent>
<xs:sequence>
<xs:choice minOccurs="0" maxOccurs="unbounded">
<xs:element name="delimiter" type="en.delimiter"/>
<xs:element name="family" type="en.family"/>
<xs:element name="given" type="en.given"/>
<xs:element name="prefix" type="en.prefix"/>
<xs:element name="suffix" type="en.suffix"/>
</xs:choice>
</xs:sequence>
</xs:complexContent>
</xs:complexType>
Типы en.family
, en.given
и тому подобное смешиваются друг с другом (и для нашей цели нам больше ничего не нужно знать).
Таким образом, при доступе к содержимому имени его List<Serializable>
будет состоять из:
- a
String
, будучи пробелами между <v3:name>
и <v3:given>
- элемент
EnGiven
- a
String
, будучи пробелами между </v3:given>
и <v3:family>
- и
EnFamily
элемент
- a
String
, будучи пробелами между </v3:family>
и </v3:name>
Каждое содержимое
EnGiven
и EnFamily
будет состоять из одного String
, соответственно «Имя образца» и «Имя семейства образца». Опять же, это немного сложно, и вам, вероятно, придется применить некоторую логику для обработки конкретных случаев, но вы можете справиться с этим следующим образом.
Кстати, заполнение элемента тривиально: просто добавьте строку к желаемому List<Serializable>
содержимому.