元素 http://www.w3.org/2001/XMLSchema:complexType 在此上下文中无效

Element http://www.w3.org/2001/XMLSchema:complexType is invalid in this context

我正在尝试验证此 XML 文件

<session>
    <mic id="1" posname="T1" x="0.0" y="0.0" z="0.0" />
</session>

使用这个 XSD 文件

<?xml version="1.0" encoding="utf-8"?>
<xs:schema 
    xmlns:xs="http://www.w3.org/2001/XMLSchema" 
    attributeFormDefault="unqualified" 
    elementFormDefault="qualified">

    <xs:element name="session">
        <xs:complexType>
            <xs:sequence>
                <xs:element name="mic" type="micType" minOccurs="1" maxOccurs="4">
                </xs:element>

                <xs:complexType name="micType">
                    <xs:simpleContent>
                        <xs:extension base="xs:string">
                            <xs:attribute type="xs:int" name="id"/>
                            <xs:attribute type="xs:string" name="posname"/>
                            <xs:attribute type="xs:float" name="x"/>
                            <xs:attribute type="xs:float" name="y"/>
                            <xs:attribute type="xs:float" name="z"/>
                        </xs:extension>
                    </xs:simpleContent>
                </xs:complexType> 
            </xs:sequence>
        </xs:complexType>
    </xs:element>
</xs:schema>

但我收到此错误消息:

XmlSchema error: Element http://www.w3.org/2001/XMLSchema:complexType is invalid in this context.

如果我只有 mic 元素的属性定义,程序运行良好。我不知道我做错了什么。我正在尝试让 XSD 验证麦克风元素的数据类型。谁能告诉我我做错了什么?

名为 micType 的复杂类型应定义为全局类型声明,即它应该是 xs:schema 元素的直接子元素。

您拥有的是复杂类型的局部和全局声明的不可行混合体。全局定义 micType(如 Michael Kay 所述)或在本地定义:

全局复杂类型声明

<?xml version="1.0" encoding="utf-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" 
           attributeFormDefault="unqualified" 
           elementFormDefault="qualified">
  <xs:element name="session">
    <xs:complexType>
      <xs:sequence>
        <xs:element name="mic" type="micType" minOccurs="1" maxOccurs="4"/>
      </xs:sequence>
    </xs:complexType>
  </xs:element>
  <xs:complexType name="micType">
    <xs:simpleContent>
      <xs:extension base="xs:string">
        <xs:attribute type="xs:int" name="id"/>
        <xs:attribute type="xs:string" name="posname"/>
        <xs:attribute type="xs:float" name="x"/>
        <xs:attribute type="xs:float" name="y"/>
        <xs:attribute type="xs:float" name="z"/>
      </xs:extension>
    </xs:simpleContent>
  </xs:complexType>
</xs:schema>

本地复杂类型声明

<?xml version="1.0" encoding="utf-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" 
           attributeFormDefault="unqualified" 
           elementFormDefault="qualified">
  <xs:element name="session">
    <xs:complexType>
      <xs:sequence>
        <xs:element name="mic" minOccurs="1" maxOccurs="4">
          <xs:complexType>
            <xs:simpleContent>
              <xs:extension base="xs:string">
                <xs:attribute type="xs:int" name="id"/>
                <xs:attribute type="xs:string" name="posname"/>
                <xs:attribute type="xs:float" name="x"/>
                <xs:attribute type="xs:float" name="y"/>
                <xs:attribute type="xs:float" name="z"/>
              </xs:extension>
            </xs:simpleContent>
          </xs:complexType>
        </xs:element>
      </xs:sequence>
    </xs:complexType>
  </xs:element>
</xs:schema>

任何一种方式都可以,并且会成功验证您的 XML。