Как создать схему для составных типов? - PullRequest
3 голосов
/ 21 августа 2010

У меня есть спецификация XML, которая выглядит следующим образом:

<Root>
    <Directory Name="SomeName">
        <TextFile Name="ExampleDocument.txt>This is the content of my sample text file.</TextFile>
        <Directory Name="SubDirectory">
            <Speech Name="Example Canned Speech">
               ...
            </Speech>
        </Directory>
    </Directory>
</Root>

Обратите внимание, что Directory элементы могут содержать другие Directory элементы. Как я могу представить это с помощью схемы W3C?

Ответы [ 2 ]

2 голосов
/ 21 августа 2010

Вам необходимо создать рекурсивный <complexType> для представления вашего <Directory> типа. Ниже приведен пример этой техники с учетом предоставленных вами элементов.

  <xs:complexType name="DirectoryType">
    <xs:sequence>
      <xs:element name="TextFile"/>
      <xs:element name="Speech"/>
      <xs:element name="Directory" type="DirectoryType"/>
    </xs:sequence>
  </xs:complexType>

  <xs:element name="Root">
    <xs:complexType>
      <xs:sequence>
        <xs:element name="Directory" type="DirectoryType" />
      </xs:sequence>
    </xs:complexType>
  </xs:element>
2 голосов
/ 21 августа 2010

Это должно сделать это (вы можете ограничить имена дальше, чем xs:string):

<?xml version="1.0" encoding="utf-8"?>
<!-- Remember to change namespace name with your own -->
<xs:schema
    targetNamespace="http://tempuri.org/XMLSchema1.xsd"
    elementFormDefault="qualified"
    xmlns="http://tempuri.org/XMLSchema1.xsd"
    xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <xs:element name="Root" type="Container"/>

  <xs:element name="Directory" >
    <xs:complexType>
      <xs:complexContent>
        <xs:extension base="Container">
          <xs:attribute name="Name" type="xs:string" use="required"/>
        </xs:extension>
      </xs:complexContent>
    </xs:complexType>
  </xs:element>

  <xs:element name="TextFile">
    <xs:complexType>
      <xs:simpleContent>
        <xs:extension base="xs:string">
          <xs:attribute name="Name" use="required"/>
        </xs:extension>
      </xs:simpleContent>
    </xs:complexType>
  </xs:element>

  <xs:complexType name="Container">
      <xs:choice minOccurs="0" maxOccurs="unbounded">
        <xs:element ref="Directory"/>
        <xs:element ref="TextFile"/>
      </xs:choice>
  </xs:complexType>
</xs:schema>

Проверено на:

<?xml version="1.0" encoding="utf-8" ?>
<Root xmlns="http://tempuri.org/XMLSchema1.xsd">
  <Directory Name="SomeName">
    <TextFile Name="ExampleDocument.txt">This is the content of my sample text file.</TextFile>
    <Directory Name="SubDirectory">
    </Directory>
    <TextFile Name="hej">

    </TextFile>
  </Directory>
  <TextFile Name="file.txt"/>
</Root>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...