Обновление вашего вопроса показывает, что настоящая проблема заключается в элементе <general>
.Допустимым документом будет
<?xml version="1.0" encoding="UTF-8"?>
<general xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="schema2.xsd">
<field>
<value>enjoy</value>
</field>
</general>
Расширение типа «поле» не изменяет исходный тип.Вместо этого он создает новый тип, основанный на старом типе «поля».Если вы хотите, чтобы оба элемента <value>
и <length>
были элементами элемента <field>
, вам следует изменить тип элемента <field>
с «поля» на «составное поле».
<xs:element name="general">
<xs:complexType>
<xs:sequence>
<xs:element name="field" type="composite-Field" />
</xs:sequence>
</xs:complexType>
</xs:element>
Это подтверждает документ
<?xml version="1.0" encoding="UTF-8"?>
<general xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="schema2.xsd">
<field>
<value>enjoy</value>
<length>30</length>
</field>
</general>
Другое решение состоит в том, чтобы изменить элемент <general>
, имеющий дочерний элемент <MyCompositeField>
вместо элемента <field>
, так как <MyCompositeField>
уже имееттип контента "составное поле"
<xs:element name="general">
<xs:complexType>
<xs:sequence>
<xs:element ref="MyCompositeField" />
</xs:sequence>
</xs:complexType>
</xs:element>
, который будет проверять документ
<?xml version="1.0" encoding="UTF-8"?>
<general xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="schema2.xsd">
<MyCompositeField>
<value>enjoy</value>
<length>30</length>
</MyCompositeField>
</general>
Обновление 2010-08-14
Комментарий автора оригинала:
Но я хочу, чтобы элемент 'general' имел возможность содержать либо 'field', либо 'составное поле'.Не ограничивайтесь наличием ТОЛЬКО одного из этих типов.
Итак, ваша реальная проблема в том, что вы хотите, чтобы ваша схема проверяла оба этих документа?
<?xml version="1.0" encoding="UTF-8"?>
<general xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="schema2.xsd">
<field>
<value>enjoy</value>
</field>
</general>
и
<?xml version="1.0" encoding="UTF-8"?>
<general xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="schema2.xsd">
<MyCompositeField>
<value>enjoy</value>
<length>30</length>
</MyCompositeField>
</general>
В этом случае весь вопрос можно рассматривать как:
- "как разрешить элементу иметь один из этих вариантов выбора в качестве дочернего элемента?"
илипотому что ваши типы почти одинаковы: - «как разрешить необязательный элемент (элемент, который может отсутствовать)?»
Весь вопрос мог бы быть решен намного быстрее, если бы вы имеливначале четко указывалось, какую цель / код вы хотите достичь и какой код у вас есть в настоящее время, что вызывает ваши проблемы
Ответ на # 1 Используйте <xs:choice>
, чтобы разрешить один из несколькихнезависимое дочернее содержимое.
С этой структурой вы можете разрешить <general>
иметь либо <field>
, либо <MyCompositeField>
дочерний элемент
<xs:element name="general">
<xs:complexType>
<xs:choice>
<xs:element name="field" type="field" />
<xs:element name="MyCompositeField" type="composite-Field" />
</xs:choice>
</xs:complexType>
</xs:element>
Так что это изменение в вашей схеме позволитдокументы, которые я разместил выше.
Ответ на # 2 Если единственная причина иметь тип composite-Field
состоит в том, чтобы допустить дополнительный элемент <length>
, вы можете просто легко изменить исходный тип field
и использовать его вместо типа composite-Field
<xs:complexType name="field">
<xs:sequence>
<xs:element name="value" type="xs:string" />
<xs:element name="length" type="xs:integer" minOccurs="0" />
</xs:sequence>
</xs:complexType>
Это определение схемы создает тип, который допускает необязательный элемент длины и, таким образом, проверяет оба этих документа
<?xml version="1.0" encoding="UTF-8"?>
<general xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="schema2.xsd">
<field>
<value>enjoy</value>
</field>
</general>
и
<?xml version="1.0" encoding="UTF-8"?>
<general xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="schema2.xsd">
<field>
<value>enjoy</value>
<length>30</length>
</field>
</general>