针对XML错误的xml架构

时间:2012-12-20 19:09:11

标签: xml xsd

我正在写一个xml架构来反对xml文件。我为以下代码得到了这个错误,但无法弄清楚原因。有什么建议吗?

cvc-type.3.1.1:元素'employees'是一个简单类型,因此它不能具有属性,除了名称空间名称与'http://www.w3.org/2001/XMLSchema-instance相同的属性'和[本地名称]是'type','nil','schemaLocation'或'noNamespaceSchemaLocation'之一。然而,找到了属性'essns'。从:simpleType开始发现问题。

<xs:element name="employees" >
      <xs:simpleType>
        <xs:list itemType ="xs:integer"/>
      </xs:simpleType>
      </xs:element>
      <xs:element name= "projectsControlled">
      <xs:simpleType>
        <xs:list itemType ="xs:integer" />
      </xs:simpleType>
      </xs:element>

以下是xml代码

<employees essns="888665555"/>
<projectsControlled pnos="20"/>

1 个答案:

答案 0 :(得分:2)

元素可能包含简单类型或复杂类型。

具有简单类型的元素只不过是适当类型的有效类型的包装器。它不允许有其他内容,不允许有子元素,也不允许有属性。

也就是说,只允许由复杂类型控制的元素具有属性。 (如错误消息中所述,对xsi:nil,xsi:type,xsi:schemaLocation和xsi:noNamespaceSchemaLocation进行了异常。)

您的'employees'元素被声明为具有简单类型:整数列表。因此允许包含整数列表,但是您没有为它声明任何属性。如果你想这样做,你可以声明它具有“具有简单内容的复杂类型” - 本质上是一种复杂类型,它通过添加属性来扩展一个简单类型。

<xs:simpleType name="list-of-integers">
  <xs:list itemType="xs:integer"/>
</xs:simpleType>

<xs:element name="employees">
  <xs:complexType>
    <xs:simpleContent>
      <xs:extension base="tns:list-of-integers">
        <xs:attribute name="essns" 
                      type="tns:list-of-integers"/>
      </xs:extension>
    </xs:simpleContent>
  </xs:complexType>
</xs:element>

或者您打算将employees声明为具有名为essns的属性的空元素,其值可以是整数列表。在这种情况下,您不希望复杂类型包含简单内容,因为您想要的不是简单内容,而是没有内容。

<xs:element name="employees-sib">
  <xs:complexType mixed="false">
    <xs:sequence/>
    <xs:attribute name="essns" 
                  type="tns:list-of-integers"/>
  </xs:complexType>
</xs:element>