Мы используем атрибут nilReason, чтобы выразить, почему XML-элемент пуст. Примеры:XML-сериализация элементов без элементов с атрибутами в C#
<dateOfDeath nilReason="noValue" xsi:nil="true"/>
<dateOfDeath nilReason="valueUnknown" xsi:nil="true"/>
В первом примере человек все еще жив, потому что нет даты смерти. Во втором примере мы не знаем, какова дата смерти.
XSD-определение этого элемента приводится ниже:
<xs:element name="dateOfDeath" type="DateOfDeath" nillable="true"/>
<xs:complexType name="DateOfDeath">
<xs:simpleContent>
<xs:extension base="xs:date">
<xs:attribute name="nilReason" type="NilReason"/>
</xs:extension>
</xs:simpleContent>
</xs:complexType>
<xs:simpleType name="NilReason">
<xs:restriction base="xs:string">
<xs:enumeration value="noValue"/>
<xs:enumeration value="valueUnknown"/>
</xs:restriction>
</xs:simpleType>
я столкнуться с проблемами, когда я генерировать C# классы с помощью инструмента Xsd.exe, который предоставляется в рамках .net. Как написать код, который создает следующий XML?
<dateOfDeath nilReason="noValue" xsi:nil="true"/>
Это наилучшее приближение код, который я смог написать:
DateOfDeath dateOfDeath = new DateOfDeath();
dateOfDeath.nilReason = NilReason.noValue;
dateOfDeath.nilReasonSpecified = true;
XmlSerializer serializer = new XmlSerializer(typeof(DateOfDeath));
StreamWriter writer = new StreamWriter("dateofdeath.xml");
serializer.Serialize(writer, dateOfDeath);
writer.Close();
Однако, к сожалению, этот код выдает следующий результат:
<dateOfDeath nilReason="noValue">0001-01-01</dateOfDeath>
, который не является именно то, что Я хочу, потому что он генерирует значение фиктивной даты. Похоже, что это недостаток сериализатора. Единственный способ обойти эту проблему, похоже, заключается в применении функции, которая удаляет фиктивное значение и вставляет атрибут xsi: nil = "true" после сериализации. Тогда также нужна функция, которая удаляет атрибут xsi: nil = "true" перед десериализацией. В противном случае информация атрибута nilReason будет выбрасываться во время процесса десериализации.
Конечно, 'DateofDeath = новый DateOfDeath() '- i t не равно нулю. –
@AlexanderPetrov: на самом деле объект dateOfDeath не является нулевым, потому что мне нужно установить такие свойства, как 'dateOfDeath.noValue =" noValue "', который соответствует атрибуту XML noValue. Однако я не могу установить свойство 'dateOfDeath.Value = null', которое соответствует пустому содержимому самого элемента. Эта проблема вызвана тем, что сгенерированный тип данных DateTime не является nillable. Я попытался решить эту проблему, заменив все вхождения DateTime на DateTime? в сгенерированном коде. Но затем сериализатор выдает ошибку. –
Вы получите 'xsi: nil =" true "' в одном случае: 'DateOfDeath dateOfDeath = null;' –