我的XML包含一个具有以下属性的元素:xsi:type =“AnswerBool”。我的xsd有该元素,并设置了一个名为=“type”的属性,然后将枚举值限制为“AnswerBool”(以及其他)。但是,当我尝试验证XML时,它失败了。如果我更改XML以使元素使用类型而不是xsi:type all就可以了。
XML:
<Answer xsi:type="AnswerBool">
-1
XSD:
<xs:element name="Answer" minOccurs="0" maxOccurs="unbounded">
<xs:complexType>
<xs:sequence>
<xs:element name="Value">
<xs:complexType>
<xs:simpleContent>
<xs:extension base="xs:string">
<xs:attribute name="type">
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:enumeration value="xsd:int"/>
</xs:restriction>
</xs:simpleType>
</xs:attribute>
</xs:extension>
</xs:simpleContent>
</xs:complexType>
</xs:element>
</xs:sequence>
<xs:attribute name="type" use="optional">
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:enumeration value="AnswerBool"/>
<xs:enumeration value="AnswerMsc2DTO"/>
</xs:restriction>
</xs:simpleType>
</xs:attribute>
</xs:complexType>
</xs:element>
我试图将“type”属性命名为“xsi:type”,但我不允许在名称中使用“:”。不幸的是,我无法在“类型”之前更新XML而不使用“xsi:”。我知道我在做什么基本上是为我的“Answer”元素允许多种不同类型的某种工作。所以我可能会把事情推得太远,无法让这一切发挥作用。然而...
有没有人对如何让我的XML进行验证有任何想法?
我的意思是有一种方法可以在我的属性名称中包含“xsi:”或者是否有办法让验证过程只查看“type”部分并忽略“xsi:”?
答案 0 :(得分:2)
首先, xsi 是传统上为架构实例提供的前缀,所以不要更改它。
其次,xsl:type
的目的是指定特定元素具有XML Schema中的特定类型。在您显示的架构的片段中,“答案”是唯一的架构类型。 “AnswerBool”和“AnswerMsc2DTO”是声明为type
的属性可能具有的值,但“type”与xsi:type
不同。
因此,在您的文件中,如果XML文件和架构都在同一个(默认)命名空间中,则应使用type
。
希望有所帮助。
答案 1 :(得分:0)
xsi,这是指示xmlns的前缀,即命名空间
xml输入可能缺少对相应命名空间的引用。
通常,xsi用于Schema-instance名称空间。
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"