C# 引用的XmlSchemaElement中的IsAbstract值不正确

C# 引用的XmlSchemaElement中的IsAbstract值不正确,c#,.net,xsd,C#,.net,Xsd,我正在使用包含抽象元素定义的XML模式,例如 <element name="AbstractX" type="some:Type" abstract="true"/> 在已解析的XmlSchemaSet中,当我通过复杂类型定义导航到元素时,它将isastract设置为false 这有什么原因吗,还是说这是System.Xml.Schema中的一个bug (为了简洁起见,我简化了XSD,所讨论的模式是)不,它不是一个bug 您在代码中看到的是对(抽象)元素的引用;引用不能标记为抽象(

我正在使用包含抽象元素定义的XML模式,例如

<element name="AbstractX" type="some:Type" abstract="true"/>
在已解析的XmlSchemaSet中,当我通过复杂类型定义导航到元素时,它将
isastract
设置为
false

这有什么原因吗,还是说这是
System.Xml.Schema
中的一个bug

(为了简洁起见,我简化了XSD,所讨论的模式是)

不,它不是一个bug

您在代码中看到的是对(抽象)元素的引用;引用不能标记为抽象(第节,仅当架构是元素的父级时,抽象才适用)

您只需:

  • 检查el.RefName.i是否为空;在您的情况下,它不是(因为您使用了ref属性)
  • 导航到GlobalElements[el.RefName]中的相应定义,将值强制转换为XmlSchemaElement,然后检查其IsaStract属性(在您的案例中为true)

这应该可以解决您的问题。

这正是我所做的,但您能详细说明为什么“引用不能标记为抽象”吗?它是一个XmlSchemaElement,所有其他信息都来自引用的元素,为什么不是这个?@voidengine,规范这么说(我已经用引用更新了我的答案)。声明
所有其他信息取自引用元素是不正确的。例如,SchemaTypeName信息在使用@ref的元素粒子上不可用,您必须导航到引用的(全局)元素,如我在回答中所述。实际上,您可能会填充ElementSchemaType,但不要忘记这是一个模式验证后信息集属性。我个人的观察是,编写API是为了尽可能地遵守规范:如果规范说不允许…(续),API不会填充它:type(不能用于ref)、abstract(将始终返回false)等等。
<complexType name="ReferencingX">
    <complexContent>
        <extension base="some:otherBaseType">
            <sequence>
                <element ref="some:AbstractX"/>
            </sequence>
        </extension>
    </complexContent>
</complexType>