Это длинный один ...указать атрибуты на ноль 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.
Вот мои вопросы :
Так как (или возможно), чтобы указать, что элемент является нулевым, но также указать значение атрибута в объекте, так что он упорядочивает правильно?
К сожалению, xml-схема - это спецификация, которая не может быть изменена. – Jeremy
Это могло быть возможно через объекты. Например, для элементов, которые содержат необязательные атрибуты, соответствующий объект содержит как свойство для атрибута, так и соответствующее свойство «Указано», чтобы указать, был ли предоставлен атрибут или нет. Почему у объекта не было свойства IsNil, чтобы вы могли создать экземпляр свойства и предоставить атрибуты, но также указать, что он был указан как nil в xml. – Jeremy
Сериализатор по умолчанию рассматривает 'xsi: nil = true' как ссылку на нулевой объект. См. Здесь: http://msdn.microsoft.com/en-us/library/ybce7f69(v=vs.85).aspx – CSJ