【问题标题】:XML element with "xsi:type" attribute does not validate. It expects a "type" attribute具有“xsi:type”属性的 XML 元素无法验证。它需要一个“类型”属性
【发布时间】:2009-09-10 20:38:16
【问题描述】:

我的 XML 包含一个具有以下属性的元素:xsi:type="AnswerBool"。我的 xsd 具有该元素并设置了一个名为“type”的属性,然后将枚举值限制为“AnswerBool”(和其他)。但是,当我尝试验证 XML 时它失败了。如果我更改 XML 以使元素使用 type 而不是 xsi:type 一切都很好。

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 更新为在“type”之前不使用“xsi:”。我知道我正在做的基本上是某种解决方法,以允许我的“答案”元素使用多种不同的类型。所以我可能把事情推得太远,无法让这一切正常工作。不过……

是否有人对如何让我的 XML 进行验证有任何想法?

我的意思是有没有办法在我的属性名称中包含“xsi:”,或者有没有办法让验证过程只查看“类型”部分而忽略“xsi:”?

【问题讨论】:

    标签: xml validation xsd


    【解决方案1】:

    首先,xsi 是模式实例的常规前缀,所以不要更改它。

    其次,xsl:type 的目的是指定特定元素具有 XML 模式中的特定类型。在您显示的架构片段中,“答案”是唯一的架构类型。 “AnswerBool”和“AnswerMsc2DTO”是声明为type 的属性可以具有的值,但该“类型”与xsi:type 不同。

    所以在你的文件中,如果 XML 文件和架构都在同一个(默认)命名空间中,你应该使用 type

    希望对您有所帮助。

    【讨论】:

      【解决方案2】:

      xsi,这里是表示xmlns的前缀,即命名空间

      xml 输入可能缺少对相应命名空间的引用。

      通常,xsi 用于 Schema-instance 命名空间。

      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
      

      【讨论】:

      • 我不太确定我明白你在说什么。 XML 根元素的实例已为w3.org/2001/XMLSchema-instance 设置。我应该以某种方式将该 xsi 添加到架构中吗?
      • 好,这个命名空间使用的前缀也是 xsi 吗?如果是,请查看 Answer 元素未有效声明为具有“xsi”类型(可能只是声明为“nothing”(即使用默认 xmlns,实际)类型。如果它不是 xsi,然后看到 Answer 节点的 type 属性使用了这个特定的前缀。
      • 似乎没有什么对我有用。我的架构实例都是一样的,仍然存在问题。我将不得不跳过使用这种方法。感谢您的帮助
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-07-20
      • 2021-01-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-01-29
      • 2012-06-01
      相关资源
      最近更新 更多