C# 引用的XmlSchemaElement中的IsAbstract值不正确
我正在使用包含抽象元素定义的XML模式,例如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 您在代码中看到的是对(抽象)元素的引用;引用不能标记为抽象(
<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>