代码之家  ›  专栏  ›  技术社区  ›  Billy ONeal IS4

如何为复合类型创建模式?

  •  3
  • Billy ONeal IS4  · 技术社区  · 14 年前

    我有一个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 元素可以包含其他 号码簿 元素。如何使用W3C模式来表示这一点?

    2 回复  |  直到 14 年前
        1
  •  2
  •   Steve Guidi    14 年前

    您需要创建一个递归 <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
  •  2
  •   Lasse Espeholt    14 年前

    应该这样做(您可能希望将名称限制在 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>