【问题标题】:How to generate xsi:nil element with attributes?如何生成具有属性的 xsi:nil 元素?
【发布时间】:2010-10-27 14:12:20
【问题描述】:

我有一个 WCF 客户端,它需要生成包含此 XML 片段的请求:

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

架构由服务器确定,不受我控制。生成的代理代码有一个包含(除其他外)属性nullFlavortypeCode 的原因元素的类。代理使用 XmlSerializer。

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

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

【问题讨论】:

    标签: c# wcf xmlserializer xsi xml-nil


    【解决方案1】:

    这是我为仍在为这个问题苦苦挣扎的人使用的解决方案。这有点像黑客,但它确实有效。关闭 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: Schema item 'attribute' named 'nil'来自命名空间“w3.org/2001/XMLSchema-instance”。属性声明的目标命名空间,无论是本地的还是全局的,都不能匹配w3.org/2001/XMLSchema-instance
    【解决方案2】:

    这是 XmlSerializer 的一个已知限制。您可以通过巧妙地使用 IXmlSerializable 接口并手动发出 XML 来绕过它 - 不幸的是,我所知道的没有一个干净的解决方案。

    【讨论】:

      猜你喜欢
      • 2021-02-07
      • 1970-01-01
      • 2013-05-31
      • 1970-01-01
      • 2013-11-16
      • 2012-10-19
      • 1970-01-01
      • 1970-01-01
      • 2023-03-23
      相关资源
      最近更新 更多