如何用属性生成xsi:nil元素?
问题描述:
我有一个WCF客户端需要生成一个包含这个XML片段的请求:如何用属性生成xsi:nil元素?
<reason xsi:nil="true" nullFlavor="NA" typeCode="RSON" />
的模式是由服务器来决定,而不是我的控制之下。生成的代理代码具有包含(除其他之外)属性nullFlavor
和typeCode
的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;
}
}
这就像一个魅力时,只需序列化/反序列化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