2012-11-16 55 views
8

我已经定义了两种复杂的元素类型 - Developer和App。如何在XML模式中定义用户定义数据类型?

开发孩子的 - ID,姓名,电子邮件

应用孩子的 - ID,姓名,开发

在这里,在应用程序的复杂元素的开发是指开发商/ ID。

如何在xml模式中定义这种关系。我正在使用XML spy2013编辑器。

我已经尝试过在简单类型开发人员 - > ID的声明中指定名称。并在App-> Developer数据类型中使用此名称。但它给错误..

<?xml version="1.0" encoding="UTF-8"?> 
<!-- edited with XMLSpy v2013 (x64) (http://www.altova.com) by Piyush (USC) --> 
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified"   attributeFormDefault="unqualified"> 
<xs:element name="appinfo"> 
    <xs:complexType> 
     <xs:sequence> 
      <xs:element name="Developer"> 
       <xs:complexType> 
        <xs:all> 
         **<xs:element name="ID">** 
          <xs:simpleType> 
           <xs:restriction base="xs:string"> 
            <xs:length value="5"/> 
            <xs:pattern value="[a-zA-Z][a-zA-Z][0-9][0-9][a-zA-Z]"/> 
           </xs:restriction> 
          </xs:simpleType> 
         </xs:element> 
         <xs:element name="Name"> 
          <xs:simpleType> 
           <xs:restriction base="xs:string"> 
            <xs:pattern value="([a-zA-Z])+"/> 
           </xs:restriction> 
          </xs:simpleType> 
         </xs:element> 
         <xs:element name="Email"> 
          <xs:simpleType> 
           <xs:restriction base="xs:string"> 
            <xs:pattern value="[^@][email protected][^\.]+\..+"/> 
           </xs:restriction> 
          </xs:simpleType> 
         </xs:element> 
         <xs:element name="Company" type="xs:string"/> 
         <xs:element name="Website" type="xs:string"/> 
         <xs:element name="Phone"> 
          <xs:simpleType> 
           <xs:restriction base="xs:string"> 
            <xs:length value="13"/> 
           </xs:restriction> 
          </xs:simpleType> 
         </xs:element> 
        </xs:all> 
       </xs:complexType> 
      </xs:element> 
      <xs:element name="App"> 
       <xs:complexType> 
        <xs:all> 
         <xs:element name="ID"> 
          <xs:simpleType> 
           <xs:restriction base="xs:string"> 
            <xs:length value="5"/> 
            <xs:pattern value="[0-9][0-9][0-9][0-9][A-Z]"/> 
           </xs:restriction> 
          </xs:simpleType> 
         </xs:element> 
         <xs:element name="Name"> 
          <xs:simpleType> 
           <xs:restriction base="xs:string"> 
            <xs:pattern value="([a-zA-Z])+"/> 
           </xs:restriction> 
          </xs:simpleType> 
         </xs:element> 
         <xs:element name="Developer" ***type="xs:anySimpleType"/>*** 
         <xs:element name="Price"> 
          <xs:simpleType> 
           <xs:restriction base="xs:float"> 
            <xs:minInclusive value="0.00"/> 
            <xs:maxInclusive value="6.99"/> 
           </xs:restriction> 
          </xs:simpleType> 
         </xs:element> 
         <xs:element name="TabletCompatible" type="xs:boolean" minOccurs="0"/> 
         <xs:element name="Category"> 
          <xs:simpleType> 
           <xs:restriction base="xs:string"> 
            <xs:enumeration value="Travel"/> 
            <xs:enumeration value="Productivity"/> 
            <xs:enumeration value="Game"/> 
            <xs:enumeration value="Music"/> 
            <xs:enumeration value="Education"/> 
            <xs:enumeration value="Lifestyle"/> 
           </xs:restriction> 
          </xs:simpleType> 
         </xs:element> 
         <xs:element name="Platform"> 
          <xs:simpleType> 
           <xs:restriction base="xs:string"> 
            <xs:enumeration value="Android"/> 
            <xs:enumeration value="iOS"/> 
            <xs:enumeration value="Blackberry"/> 
           </xs:restriction> 
          </xs:simpleType> 
         </xs:element> 
        </xs:all> 
       </xs:complexType> 
      </xs:element> 
      <xs:element name="AppStat"> 
       <xs:complexType> 
        <xs:all> 
         <xs:element name="AppID" type="xs:anySimpleType"/> 
         <xs:element name="Statistics"> 
          <xs:complexType> 
           <xs:sequence maxOccurs="unbounded"> 
            <xs:element name="Platform" type="xs:anySimpleType"/> 
            <xs:element name="Downloads" type="xs:positiveInteger"/> 
            <xs:element name="Rating"> 
             <xs:simpleType> 
              <xs:restriction base="xs:float"> 
               <xs:minInclusive value="0.0"/> 
               <xs:maxInclusive value="5.0"/> 
              </xs:restriction> 
             </xs:simpleType> 
            </xs:element> 
           </xs:sequence> 
          </xs:complexType> 
         </xs:element> 
         <xs:element name="LastChecked" type="xs:date"/> 
        </xs:all> 
       </xs:complexType> 
      </xs:element> 
     </xs:sequence> 
    </xs:complexType> 
</xs:element> 

+0

我不知道是谁upvoted这个问题或者为什么,但我downvoting它。如果您编写了一些代码,但它给了我们一个错误,您应该向我们展示您编写的代码以及它给出的错误,然后我们可以看到错误发生的位置。你不能害怕或尴尬显示你的编码尝试;最好的学习方法是让你的努力受到你正在学习的技术更丰富经验的人的批判性评论。 –

回答

10

使用通用的简单类型的开发者ID的方法是将其声明为开头命名类型:

<xs:schema 
    xmlns:xs="http://www.w3.org/2001/XMLSchema" 
    elementFormDefault="qualified"   
    attributeFormDefault="unqualified"> 

    <xs:simpleType name="developerID"> 
    <xs:restriction base="xs:string"> 
     <xs:length value="5"/> 
     <xs:pattern value="[a-zA-Z][a-zA-Z][0-9][0-9][a-zA-Z]"/> 
    </xs:restriction> 
    </xs:simpleType> 

    . . . 

,然后使用它:

. . . 
    <xs:element name="Developer" maxOccurs="unbounded"> 
     <xs:complexType> 
     <xs:all> 
      <xs:element name="ID" type="developerID"> 
. . . 
    <xs:element name="App" maxOccurs="unbounded"> 
     <xs:complexType> 
     <xs:all> 
      . . . 
      <xs:element name="Developer" type="developerID"/> 

但是,这不足以创建一个约束,以便appinfo/App/Developer ca n仅包含appinfo/Developer/ID中声明的开发人员ID中的一个。要做到这一点,必须使用xs:key创建一个唯一的密钥定义,并使用xs:keyref(请参阅here)引用它。

下面是完整的XSD:

<xs:schema 
    xmlns:xs="http://www.w3.org/2001/XMLSchema" 
    elementFormDefault="qualified"   
    attributeFormDefault="unqualified"> 

    <xs:simpleType name="developerID"> 
    <xs:restriction base="xs:string"> 
     <xs:length value="5"/> 
     <xs:pattern value="[a-zA-Z][a-zA-Z][0-9][0-9][a-zA-Z]"/> 
    </xs:restriction> 
    </xs:simpleType> 

    <xs:element name="appinfo"> 
    <xs:complexType> 
     <xs:sequence> 
     <xs:element name="Developer" maxOccurs="unbounded"> 
      <xs:complexType> 
      <xs:all> 
       <xs:element name="ID" type="developerID"> 
       </xs:element> 
       <xs:element name="Name"> 
       <xs:simpleType> 
        <xs:restriction base="xs:string"> 
        <xs:pattern value="([a-zA-Z])+"/> 
        </xs:restriction> 
       </xs:simpleType> 
       </xs:element> 
       <xs:element name="Email"> 
       <xs:simpleType> 
        <xs:restriction base="xs:string"> 
        <xs:pattern value="[^@][email protected][^\.]+\..+"/> 
        </xs:restriction> 
       </xs:simpleType> 
       </xs:element> 
       <xs:element name="Company" type="xs:string"/> 
       <xs:element name="Website" type="xs:string"/> 
       <xs:element name="Phone"> 
       <xs:simpleType> 
        <xs:restriction base="xs:string"> 
        <xs:length value="13"/> 
        </xs:restriction> 
       </xs:simpleType> 
       </xs:element> 
      </xs:all> 
      </xs:complexType> 
     </xs:element> 
     <xs:element name="App" maxOccurs="unbounded"> 
      <xs:complexType> 
      <xs:all> 
       <xs:element name="ID"> 
       <xs:simpleType> 
        <xs:restriction base="xs:string"> 
        <xs:length value="5"/> 
        <xs:pattern value="[0-9][0-9][0-9][0-9][A-Z]"/> 
        </xs:restriction> 
       </xs:simpleType> 
       </xs:element> 
       <xs:element name="Name"> 
       <xs:simpleType> 
        <xs:restriction base="xs:string"> 
        <xs:pattern value="([a-zA-Z])+"/> 
        </xs:restriction> 
       </xs:simpleType> 
       </xs:element> 
       <xs:element name="Developer" type="developerID"/> 
       <xs:element name="Price"> 
       <xs:simpleType> 
        <xs:restriction base="xs:float"> 
        <xs:minInclusive value="0.00"/> 
        <xs:maxInclusive value="6.99"/> 
        </xs:restriction> 
       </xs:simpleType> 
       </xs:element> 
       <xs:element name="TabletCompatible" type="xs:boolean" minOccurs="0"/> 
       <xs:element name="Category"> 
       <xs:simpleType> 
        <xs:restriction base="xs:string"> 
        <xs:enumeration value="Travel"/> 
        <xs:enumeration value="Productivity"/> 
        <xs:enumeration value="Game"/> 
        <xs:enumeration value="Music"/> 
        <xs:enumeration value="Education"/> 
        <xs:enumeration value="Lifestyle"/> 
        </xs:restriction> 
       </xs:simpleType> 
       </xs:element> 
       <xs:element name="Platform"> 
       <xs:simpleType> 
        <xs:restriction base="xs:string"> 
        <xs:enumeration value="Android"/> 
        <xs:enumeration value="iOS"/> 
        <xs:enumeration value="Blackberry"/> 
        </xs:restriction> 
       </xs:simpleType> 
       </xs:element> 
      </xs:all> 
      </xs:complexType> 
      <xs:keyref name="developerIDref" refer="developerID"> 
      <xs:selector xpath="."/> 
      <xs:field xpath="Developer"/> 
      </xs:keyref> 
     </xs:element> 
     <xs:element name="AppStat"> 
      <xs:complexType> 
      <xs:all> 
       <xs:element name="AppID" type="xs:anySimpleType"/> 
       <xs:element name="Statistics"> 
       <xs:complexType> 
        <xs:sequence maxOccurs="unbounded"> 
        <xs:element name="Platform" type="xs:anySimpleType"/> 
        <xs:element name="Downloads" type="xs:positiveInteger"/> 
        <xs:element name="Rating"> 
         <xs:simpleType> 
         <xs:restriction base="xs:float"> 
          <xs:minInclusive value="0.0"/> 
          <xs:maxInclusive value="5.0"/> 
         </xs:restriction> 
         </xs:simpleType> 
        </xs:element> 
        </xs:sequence> 
       </xs:complexType> 
       </xs:element> 
       <xs:element name="LastChecked" type="xs:date"/> 
      </xs:all> 
      </xs:complexType> 
     </xs:element> 
     </xs:sequence> 
    </xs:complexType> 
    <xs:key name="developerID"> 
     <xs:selector xpath="Developer"/> 
     <xs:field xpath="ID"/> 
    </xs:key> 
    </xs:element> 

</xs:schema> 
相关问题