Как избежать использования глобальных элементов в XML-схеме - PullRequest
2 голосов
/ 02 сентября 2011

Я хочу создать XML-схему, которая допускает только один корневой узел.

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

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

Как создать глобальные элементы, которые разрешено использовать только в качестве ref-элемента внутри моей корневой структуры?

Вот что я хочу иметь:

<root>
  <branch>
     <leaf/>
  </branch>
  <branch>
     <fork>
        <branch>
          <leaf/>
        </branch>
        </leaf>
     </fork>
</root>

Но это также будет допустимо <leaf/> как корневой узел

1 Ответ

0 голосов
/ 02 сентября 2011

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

Сначала он должен быть правильно сформирован так:

<?xml version="1.0" encoding="UTF-8"?>

<root xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="your-scheme.xsd>
    <branch>
        <leaf/>
    </branch>
    <branch>
        <fork>
            <branch>
                <leaf/>
            </branch>
            <leaf/>
        </fork>
    </branch>
</root>

Я бы предложил схему, подобную этой:

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
    <xs:complexType name="root">
        <xs:sequence>
            <xs:element ref="branch" minOccurs="0" maxOccurs="unbounded"/>
        </xs:sequence>
    </xs:complexType>
    <xs:complexType name="branch">
        <xs:choice>
            <xs:element ref="fork" minOccurs="0" maxOccurs="unbounded"/>
            <xs:element ref="leaf" minOccurs="0" maxOccurs="unbounded"/>
        </xs:choice>
    </xs:complexType>
    <xs:complexType name="fork">
        <xs:sequence>
            <xs:element ref="branch" minOccurs="0" maxOccurs="unbounded"/>
            <xs:element ref="leaf" minOccurs="0" maxOccurs="unbounded"/>
        </xs:sequence>
    </xs:complexType>
    <xs:complexType name="leaf"/>
    <xs:element name="root" type="root"/>
    <xs:element name="branch" type="branch"/>
    <xs:element name="fork" type="fork"/>
    <xs:element name="leaf" type="leaf"/>
</xs:schema>

Надеюсь, это поможет вам.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...