当前位置: 首页 > 知识库问答 >
问题:

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

黄意智
2023-03-14

我正在尝试验证这个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错误:元素http://www.w3.org/2001/XMLSchema:complexType在此上下文中无效。

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

共有2个答案

章兴发
2023-03-14

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

<?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。

公冶光亮
2023-03-14

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

 类似资料: