2014-12-18 5 views
2

Это длинный один ...указать атрибуты на ноль XML-элемент

У меня есть XSD, который определяет сложный тип, который может иметь nillable элемент, но этот элемент имеет обязательный атрибут. Вот упрощенный пример:

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" attributeFormDefault="unqualified" > 
    <xs:element name="Test"> 
     <xs:complexType> 
      <xs:sequence> 
       <xs:element name="NillableElementTest" type="MyNillableElement" nillable="true" minOccurs="0" maxOccurs="1"/> 
      </xs:sequence> 
     </xs:complexType> 
    </xs:element> 

    <xs:complexType name="MyNillableElement"> 
     <xs:sequence> 
      <xs:element name="id" minOccurs="1" maxOccurs="unbounded"/> 
     </xs:sequence> 
     <xs:attribute name="RequredAttribute" use="required"/> 
    </xs:complexType> 
</xs:schema> 

На основе приведенной выше схеме, следующие XML-документы действительны:

<Test xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 
    <NillableElementTest RequredAttribute="test" xsi:nil="true"></NillableElementTest> 
</Test> 

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

Было бы неправильным иметь элемент NillableElementTest без значения RequredAttribute:

<Test xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 
    <NillableElementTest xsi:nil="true"></NillableElementTest> 
</Test> 

У меня есть объектная модель (классы), которая представляет собой приведенную выше схему. Объектная модель была создана из xsd с помощью инструмента .net framework.

Если я десериализую xml в экземпляр объекта, свойство NillableTestElement всегда равно null, если xml: xil: nil = "true". Обычно это имеет смысл для меня, за исключением того факта, что свойство NillableTestElement не будет представлять значение RequredAttribute, указанное в xml.

В сообщении xml schema primer указано, что механизм nil применяется только к значениям элементов, а не к атрибутам. Элемент с xsi: nil = "true" может не содержать какого-либо элемента, но он может по-прежнему нести атрибуты.

Сценарий, в котором элемент равен нулю, но атрибуты не могут быть представлены созданной объектной моделью.

Так что теперь, если я возьму экземпляр объекта и попытаться сериализовать его XML, я буду получать Invalid XML, если он сверяется схемы, так как объект сериализует MyNillableElement как:

<Test xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 
    <NillableElementTest xsi:nil="true"></NillableElementTest> 
</Test> 

.. . Ясно, что xsd утверждает, что элемент NillableELementTest должен иметь атрибут RequredAttribute.

Вот мои вопросы :

Так как (или возможно), чтобы указать, что элемент является нулевым, но также указать значение атрибута в объекте, так что он упорядочивает правильно?

ответ

0

Вы сказали, что лучше всего в вашем вопросе:

Сценарий, где элемент равен нулю, но атрибуты не кажется, не , чтобы иметь возможность быть представленными сгенерированной объектной модели.

В C# подэлемент NillableElementTest представлен как ссылка на другой объект. Если элемент нользначен, он интерпретируется как нулевая ссылка, которая, как вы знаете, не может переносить значения для других атрибутов.

В XML, как вы показали, возможно иметь элемент, который равен nil- , оцененный, но при этом несут другие атрибуты. Эта парадигма плохо переносится на объекты.

Будет ли он работать для вас, чтобы ваш MyNillableElement содержал 0 или более экземпляров id, а не по крайней мере 1? Таким образом, вы позволяете себе возможность иметь пустую, которая может переносить другие атрибуты, а не иметь нуль/ноль.

+0

К сожалению, xml-схема - это спецификация, которая не может быть изменена. – Jeremy

+0

Это могло быть возможно через объекты. Например, для элементов, которые содержат необязательные атрибуты, соответствующий объект содержит как свойство для атрибута, так и соответствующее свойство «Указано», чтобы указать, был ли предоставлен атрибут или нет. Почему у объекта не было свойства IsNil, чтобы вы могли создать экземпляр свойства и предоставить атрибуты, но также указать, что он был указан как nil в xml. – Jeremy

+1

Сериализатор по умолчанию рассматривает 'xsi: nil = true' как ссылку на нулевой объект. См. Здесь: http://msdn.microsoft.com/en-us/library/ybce7f69(v=vs.85).aspx – CSJ

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