如何用属性生成xsi:nil元素?

问题描述:

我有一个WCF客户端需要生成一个包含这个XML片段的请求:如何用属性生成xsi:nil元素?

<reason xsi:nil="true" nullFlavor="NA" typeCode="RSON" /> 

的模式是由服务器来决定,而不是我的控制之下。生成的代理代码具有包含(除其他之外)属性nullFlavortypeCode的reason元素的类。该代理使用XmlSerializer。

如何生成这样的片段?仅当相应的成员为空时,XmlSerializer才会发出xsi:nil属性。如果它是空的,它不能很好地具有将作为属性发射的属性!

顺便说一句,该片段是根据XML架构实例规范合法的,该规范说nil元素不能包含任何子元素或内部文本,但可能包含属性。

这是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; 
    } 
} 
+0

这就像一个魅力时,只需序列化/反序列化XML消息,而是嵌入在WCF的请求,这将导致WSDL被视为无效信息:System.InvalidOperationException:架构项目从命名空间'http://www.w3.org/2001/XMLSchema-instance'命名为'nil'的'属性'。属性声明的目标名称空间无论是本地还是全局,都不得与http://www.w3.org/2001/XMLSchema-instance匹配。 – oerkelens 2016-04-15 10:33:18