XML-схема объявляет корень - PullRequest
1 голос
/ 21 марта 2012

Если у меня есть схема, подобная этой:

<?xml version="1.0" encoding="utf-8"?>
<xs:schema  targetNamespace="http://mysticwarlords.kaa/XMLSchema"
            xmlns="http://mysticwarlords.kaa/XMLSchema"
            xmlns:xs="http://www.w3.org/2001/XMLSchema">

    <xs:simpleType name="titletype">
        <xs:restriction base="xs:string">
            <xs:enumeration value="Warlord"/>
            <xs:enumeration value="FirstMate"/>
            <xs:enumeration value="Jester"/>
        </xs:restriction>
    </xs:simpleType>

    <xs:element name="warlord">
        <xs:complexType>
            <xs:sequence>
                <xs:element name="warlordName" type="xs:string"/>
            </xs:sequence>
            <xs:attribute name="title" type="titletype" />
        </xs:complexType>
    </xs:element>

    <xs:element name="warband">
        <xs:complexType>
          <xs:sequence>
            <xs:element name="warbandName" type="xs:string" />
            <xs:element name="warlords">
              <xs:complexType>
                <xs:sequence>
                  <xs:element ref="warlord" minOccurs="1" maxOccurs="unbounded">
                    <xs:unique name="eachTitleOnlyOnce">
                        <xs:selector xpath="warlord"/>
                        <xs:field xpath="@title"/>
                    </xs:unique>
                  </xs:element>
                </xs:sequence>
              </xs:complexType>
            </xs:element>
          </xs:sequence>
        </xs:complexType>
    </xs:element>

    <xs:element name="wargroup">
        <xs:complexType>
          <xs:sequence>
            <xs:element name="wargroupName" type="xs:string" />
            <xs:element name="warlords">
              <xs:complexType>
                <xs:sequence>
                  <xs:element ref="warlord" minOccurs="1" maxOccurs="10" />
                </xs:sequence>
              </xs:complexType>
            </xs:element>
          </xs:sequence>
        </xs:complexType>
    </xs:element>

    <xs:element name="war">
        <xs:complexType>
            <xs:choice>
              <xs:element ref="wargroup"/>
              <xs:element ref="warband"/>
            </xs:choice>
        </xs:complexType>
    </xs:element>

</xs:schema>

Я полагаю, это подтвердит наличие XML-файла, который является только элементом?

Что если бы я только хотел разрешить бытькорневой элемент?

1 Ответ

1 голос
/ 25 марта 2012

Ваша схема будет проверять файлы XML, содержащие корневой элемент warlord или warband или wargroup или war.

Если я правильно понимаю ваш вопрос, вам нужно проверить только те XML-файлы, которые содержат корневой элемент war. Для этого вам нужно изменить определения warlord, warband и wargroup, чтобы они назывались комплексными типами - например ::

  <xs:complexType name="warlord"> 
      <xs:sequence> 
          <xs:element name="warlordName" type="xs:string"/> 
      </xs:sequence> 
      <xs:attribute name="title" type="titletype" /> 
  </xs:complexType> 

и затем используйте эти типы вместо ref - например ::

<xs:element name="war">   
    <xs:complexType>   
        <xs:choice>   
          <xs:element name="wargroup" type="wargroup"/>   
          <xs:element name="warband" type="warband"/>   
        </xs:choice>   
    </xs:complexType>   
</xs:element>   
...