2016-03-11 2 views
2

Я работаю с XML-схемой, которая содержит определение абстрактных элементов, такие какНеверного значения IsAbstract в ссылочном XmlSchemaElement

<element name="AbstractX" type="some:Type" abstract="true"/> 

При загрузке этой схемы в XmlSchemaSet, я могу найти этот элемент в его GlobalElements и что у него есть свойство IsAbstract, установленное на true. Все идет нормально.

Однако этот элемент также упоминается в типе, как этот

<complexType name="ReferencingX"> 
    <complexContent> 
     <extension base="some:otherBaseType"> 
      <sequence> 
       <element ref="some:AbstractX"/> 
      </sequence> 
     </extension> 
    </complexContent> 
</complexType> 

В анализируемом XmlSchemaSet, когда я перейти к элементу через сложное определение типа, он имеет IsAbstract набор для false.

Есть ли причина для этого, или это ошибка в System.Xml.Schema?

(я упростил XSD для краткости, схема в вопросе AIXM)

ответ

1

Нет, это не ошибка.

Что вы ищете в своем коде: ссылка на (абстрактный) элемент; ссылки не могут быть помечены как абстрактные (раздел 3.3.2 XML Schema Part 1, аннотация применима только тогда, когда схема является родительским элементом элемента).

Вам просто нужно:

  • проверки, если el.RefName.IsEmpty; в вашем случае это не так (поскольку вы использовали атрибут ref).
  • перейти к соответствующему определению в GlobalElements [el.RefName], передать значение в XmlSchemaElement, а затем проверить его свойство IsAbstract (что будет истинно в вашем случае).

Это должно решить вашу проблему.

+0

Это именно то, что я сделал, но можете ли вы уточнить, почему «ссылки не могут быть отмечены абстрактными»? Это XmlSchemaElement, вся другая информация взята из ссылочного элемента, почему бы и нет? – voidengine

+0

@voidengine, спецификация говорит так (я обновил свой ответ ссылкой). Неправильно указывать «вся другая информация берется из ссылочного элемента». Например, информация SchemaTypeName ** не доступна ** для элементарной частицы с использованием @ref, вы должны перейти к ссылочному (глобальному) элементу, как сказано в моем ответе. Действительно, вы можете получить заполненный ElementSchemaType, но не забывайте, что это свойство infoset после проверки схемы. Мое личное наблюдение заключается в том, что API был написан, чтобы как можно больше придерживаться спецификации: там, где спецификация не разрешена ... –

+0

(продолжение), API не заполняет ее: type (не может использоваться на ref), abstract (всегда будет возвращать false) и т. д. –

Смежные вопросы