Как создать элемент 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;
    }
}
Другие вопросы по тегам