В XSD, как я могу определить два разных элемента с одинаковым именем? - PullRequest
0 голосов
/ 14 марта 2009

У меня проблема с созданием файла xsd. Мне нужно иметь xsd файл для xml документов, который будет выглядеть так:

<message type="login">
  <login nick="Ben" gameId="chess" desiredRole="simple "/>
</message>

или как это

<message type="error">
  Error message
</message>

То есть всегда есть тег message, но он имеет разные значения атрибута type, и в зависимости от значения типа внутри тега message есть разные вещи. Я пробовал что-то вроде этого:

<xsd:element name ='message' type='messageType'>
</xsd:element>

<xsd:complexType name='messageType'/>
  <xsd:complexType name='error'>
    <xsd:complexContent>
      <xsd:extension base='messageType'>
        <xsd:attribute name ='type' use='required'>
          <xsd:simpleType>
            <xsd:restriction base='xsd:string'>
              <xsd:enumeration value='error'/>
            </xsd:restriction>
          </xsd:simpleType>
        </xsd:attribute>
      </xsd:extension>
    </xsd:complexContent>
  </xsd:complexType>

  <xsd:complexType name='login'>
    <xsd:complexContent>
      <xsd:extension base='messageType'>
        <xsd:sequence>
          <xsd:element name='login'>
            <xsd:complexType>
              <xsd:attribute name='nick' type='xsd:string' use='required'>
              </xsd:attribute>
              <xsd:attribute name='gameId' type='xsd:string' use='required'>
              </xsd:attribute>
              <xsd:attribute name='desiredRole' type='xsd:string' use='required'>
              </xsd:attribute>
            </xsd:complexType>
          </xsd:element>
        </xsd:sequence>
        <xsd:attribute name ='type' use='required'>
          <xsd:simpleType>
            <xsd:restriction base='xsd:string'>
              <xsd:enumeration value='login'/>
            </xsd:restriction>
          </xsd:simpleType>
        </xsd:attribute>
      </xsd:extension>
    </xsd:complexContent>
  </xsd:complexType>

</xsd:schema>

но это не работает (я получаю сообщение об ошибке, что тип атрибута не был определен). Может кто-нибудь помочь мне с этим?

Ответы [ 2 ]

2 голосов
/ 14 марта 2009

Как насчет

<message>
    <login />
</message>

и

<message>
    <error />
</message>

То есть не указывать атрибут type и всегда иметь элемент внутри сообщения.

1 голос
/ 14 марта 2009

XSD не позволяет вам делать именно то, что вы хотите, то есть создавать элемент, который имеет различные структуры в зависимости от значений атрибута. Однако, если вам действительно нужен этот элемент, чтобы иметь разные структуры, подобные этой, вы можете создать определение элемента, которое допускает все возможные структуры. Вы просто не можете автоматически проверить его синтаксическим анализатором, чтобы доказать, что он соответствует либо одному определению, либо другому, исключительно. Во всяком случае, не в XSD.

Попробуйте что-то вроде этого:

<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <xsd:element name="message" type="messageType"/>

  <xsd:simpleType name="typeType">
    <xsd:restriction base="xsd:string">
      <xsd:enumeration value="login"/>
      <xsd:enumeration value="error"/>
    </xsd:restriction>
  </xsd:simpleType>

  <xsd:element name="login">
    <xsd:complexType>
      <xsd:attribute name='nick'        type='xsd:string' use='required'/>
      <xsd:attribute name='gameId'      type='xsd:string' use='required'/>
      <xsd:attribute name='desiredRole' type='xsd:string' use='required'/>
    </xsd:complexType>
  </xsd:element>

  <xsd:complexType name='messageType'/>
    <xsd:sequence>
      <xsd:element ref="login" minOccurs="0" maxOccurs="1"/>
    </xsd:sequence>
    <xsd:attribute name="type" type="typeType" use="required"/>
  </xsd:complexType>
</xsd:schema>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...