代码之家  ›  专栏  ›  技术社区  ›  Emilio

XML架构元素层次结构有问题

xsd
  •  0
  • Emilio  · 技术社区  · 16 年前

    这个XML模式有什么问题?它解析不正确,我无法实现集群(element)->主机(element)->加载(element)之间的层次结构。

    <?xml version="1.0"?>
    <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
    
      <xs:element name="cluster">
        <xs:complexType>
          <xs:sequence>
            <xs:element ref="host"/>
          </xs:sequence>
        </xs:complexType>
      </xs:element>
    
      <xs:element name="host">
        <xs:complexType>
          <xs:element ref="Load"/>
          <xs:attribute name="name" type="xs:string" use="required"/>
        </xs:complexType>
      </xs:element>
    
      <xs:element name="Load">
        <xs:complexType>
          <xs:attribute name="usedPhisicalMemory" type="xs:integer"/>
        </xs:complexType>
      </xs:element>
    
    </xs:schema>
    

    谢谢你,埃米利奥

    2 回复  |  直到 16 年前
        1
  •  1
  •   Tomalak    16 年前

    允许这样的事情(我改正了 "usedPhysicalMemory" ):

    <cluster>
      <host name="foo">
        <Load usedPhysicalMemory="500" />
      </host>
      <host name="bar">
        <Load usedPhysicalMemory="500" />
      </host>
    </cluster>
    

    这个模式可以做到:

    <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
    
      <xs:element name="cluster">
        <xs:complexType>
          <xs:sequence>
            <xs:element ref="host" maxOccurs="unbounded" />
          </xs:sequence>
        </xs:complexType>
      </xs:element>
    
      <xs:element name="host">    
        <xs:complexType>
          <xs:sequence>
            <xs:element ref="Load" />
          </xs:sequence>
          <xs:attribute name="name" type="xs:string" use="required" />
        </xs:complexType>
      </xs:element>
    
      <xs:element name="Load">
        <xs:complexType>
          <xs:attribute name="usedPhysicalMemory" type="xs:integer" />
        </xs:complexType>
      </xs:element>    
    
    </xs:schema>
    

    From the MSDN on <xs:complexType> (因为 the spec 使我的大脑受伤):

    如果 group , sequence , choice all 是指定的,元素必须 按以下顺序显示:

    1. group | sequence | choice | all
    2. attribute | attributeGroup
    3. anyAttribute

    也许其他人可以指出规范中的相关部分。

        2
  •  1
  •   Gilles    16 年前

    在宿主元素中,load元素不能是complexType的子元素,必须在两者之间有序列等。