我正在学习如何编写XML模式,我想定义一个XML模式来验证这样的XML结构:
<mylist myattr="1">1 2 3 4 5 6 7</mylist>
因此,我试图定义一个使用complexType
的{{1}},并且有一个属性。
这是我提出的架构:
list
当我使用http://www.freeformatter.com/xml-validator-xsd.html针对架构验证XML时,我获得了错误
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified">
<xs:complexType name="mylist-type">
<xs:simpleContent>
<xs:extension base="xs:list" >
<xs:attribute name="myattr" type="xs:integer"/>
</xs:extension>
</xs:simpleContent>
</xs:complexType>
<xs:element name="mylist" type="mylist-type"/>
</xs:schema>
但是,如果我只是将Src-resolve.4.2: Error Resolving Component 'xs:list'.
It Was Detected That 'xs:list' Is In Namespace 'http://www.w3.org/2001/XMLSchema',
But Components From This Namespace Are Not Referenceable From Schema Document 'null'.
If This Is The Incorrect Namespace, Perhaps The Prefix Of 'xs:list' Needs To Be Changed.
If This Is The Correct Namespace, Then An Appropriate 'import' Tag Should Be Added To null'.
更改为xs:list
,那么架构会毫无问题地进行验证,这对我提出的问题是否真的是命名空间问题。
我做错了什么?
答案 0 :(得分:0)
使用
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified">
<xs:simpleType name="int-list">
<xs:list itemType="xs:integer"/>
</xs:simpleType>
<xs:complexType name="mylist-type">
<xs:simpleContent>
<xs:extension base="int-list" >
<xs:attribute name="myattr" type="xs:integer"/>
</xs:extension>
</xs:simpleContent>
</xs:complexType>
<xs:element name="mylist" type="mylist-type"/>
</xs:schema>
所以基本上首先定义一个特定的列表类型,然后在你的扩展中使用该列表类型。
答案 1 :(得分:0)
草稿架构将mylist-type
定义为xs:list
类型的扩展。但是XSD名称空间中没有名为list
的数据类型。当您替换名称xs:string
时错误消失的原因是是一个名为xs:string的类型。
当你的处理器告诉你“也许'xs:''的前缀'需要改变'时,它猜测你可能在其他命名空间中使用list
类型。
[附录] 是 xs:list,你问,如果它不是一个类型?它是从其他简单类型派生简单类型的三种方法之一。例如,以下类型声明描述了由空格分隔的整数列表。 xs:list元素上的itemType
属性说明列表项的类型。
<xs:simpleType name="list-of-integer">
<xs:list itemType="xs:integer"/>
</xs:simpleType>
与XSD中一样,也可以使用匿名类型代替命名类型;在这种情况下,相关的simpleType元素显示为xs:list的子元素。在下面的声明中,内部simpleType元素声明一个类型,其值为0到100之间的整数(包括课程中测验所用的成绩等级),外部simpleType元素声明一个由列表组成的类型这样的数字。
<xs:simpleType name="list-of-grades">
<xs:list>
<xs:simpleType>
<xs:restriction base="xs:integer">
<xs:minInclusive value="0"/>
<xs:maxInclusive value="100"/>
</xs:restriction>
</xs:simpleType>
</xs:list>
</xs:simpleType>