Как создать элемент xsi:nil с атрибутами?
У меня есть клиент WCF, который должен сгенерировать запрос, содержащий этот фрагмент XML:
<reason xsi:nil="true" nullFlavor="NA" typeCode="RSON" />
Схема определяется сервером и не находится под моим контролем. Сгенерированный прокси-код имеет класс для элемента причины, содержащий (среди прочего) свойства nullFlavor
а также typeCode
, Прокси-сервер использует XmlSerializer.
Как я могу создать такой фрагмент? XmlSerializer испускает xsi:nil
атрибут, только если соответствующий член имеет значение null. И если он нулевой, он не может иметь свойства, которые будут выдаваться как атрибуты!
Кстати, фрагмент является допустимым в соответствии со спецификацией экземпляра схемы XML, в которой говорится, что элемент nil не может содержать никаких дочерних элементов или внутреннего текста, но может содержать атрибуты.
2 ответа
Это известное ограничение XmlSerializer. Возможно, вам удастся обойти это с помощью некоторого умного использования интерфейса IXmlSerializable и выдачи XML-кода вручную - к сожалению, не существует чистого решения, о котором я знаю.
Вот решение, которое я использовал для тех, кто все еще борется с этой проблемой. Это немного взломать, но это работает. Отключите nillable и добавьте и атрибут, как показано ниже
[XmlAttributeAttribute( AttributeName = "nil", Namespace = "http://www.w3.org/2001/XMLSchema-instance" )]
public bool NillAtt
{
get
{
return this.nillAtt;
}
set
{
nillAtt = value;
}
}