具有“xsi:type”属性的XML元素不会验证。它需要一个“类型”属性

时间:2009-09-10 20:38:16

标签: xml validation xsd

我的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:”?

2 个答案:

答案 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"