Если ваши данные не являются полностью свободным форматом, я бы сделал XML специфичным для вашей модели данных:
<contact>
<home>
<tel>
<area>910</area>
<num>1234 5678</num>
</tel>
</home>
<work>
<tel>
<area>701</area>
<num>8888 8888</num>
</tel>
<fax>
<area>701</area>
<num>9999 9999</num>
</fax>
</work>
</contact>
Однако, предполагая, что у вас есть причина сделать это так, как вы это делаете (например, предполагая, что ваши данные действительно являются полностью структурированными данными в свободном формате), вы можете сделать XSD немного более понятным с помощью делать что-то вроде этого:
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="object">
<xs:complexType>
<xs:choice minOccurs="0" maxOccurs="unbounded">
<xs:element ref="string"/>
<xs:element ref="object"/>
</xs:choice>
<xs:attribute name="name" type="xs:string"/>
</xs:complexType>
</xs:element>
<xs:element name="string">
<xs:complexType>
<xs:attribute name="name" type="xs:string"/>
<xs:attribute name="value" type="xs:string"/>
</xs:complexType>
</xs:element>
</xs:schema>
Я предпочитаю схемы, где каждый element
определяется как можно более автономно - насколько это возможно - и любой тип, который используется в нескольких местах, также определяется отдельно. В вашем случае нет повторно используемого типа.
Когда XSD глубоко вложен, его становится все труднее читать и труднее поддерживать и изменять.
Примечание. Вы можете сделать имя объекта необязательным, внеся следующие изменения:
<xs:element name="object">
<xs:complexType>
<xs:choice minOccurs="0" maxOccurs="unbounded">
<xs:element ref="string"/>
<xs:element ref="object"/>
</xs:choice>
<xs:attribute name="name" type="xs:string" use="optional"/>
</xs:complexType>
</xs:element>
Но не делайте имя типа строки необязательным! (По крайней мере из того, что вы нам показали, делать это не имеет смысла.)