【问题标题】:Xmlserializer nillable element with xmlattribute, possible?带有xmlattribute的Xmlserializer nillable元素,可能吗?
【发布时间】:2014-12-05 11:15:50
【问题描述】:

我有一个对象:

class Thing {
  [Xmlarray("Widget", IsNullable=true) ] 
  List<Widget> Widgets;
 } 

class Widget  {
  [Xmlattribute] 
  public string Name;
  [XmlTextAttribute] 
  public string Value; 
} 

基本上我希望示例输出看起来像:

<Thing>
  <Widget name="foo" xsi:nil="true"/>
  <Widget name="bar">Nerds</Widget>
</Thing>

我遇到的问题是 xmlserializer 没有为 foo 行执行此操作。对于 Value 包含 null 的小部件,它不会写出 xsi:nil 位。它只是一个空元素 (&lt;Widget name="foo"/&gt;

最终吃掉这个 Xml 的解析器很旧,而且很垃圾,而且不受我的控制。如果我希望将小部件记录从其系统/存储中删除而不是将其设置为空(如果空小部件条目中缺少 nil 位,则它会执行此操作),它希望 nil 位存在。

如有错误,请在手机上写。本质上,我如何让 xmlserializer 写入 nil 位?

更新:这是实际的标签。我正在阅读关于如果 arrayitem 上有一个属性(小部件列表中的小部件)如何不能设置为 nillable 的模糊内容。

<Widget xsi:nil="true"/>

对我来说没用,正如我所提到的——条目需要 name 属性和 nil=true (它告诉处理器“这个字段,从存储中删除它”)。没有 name 属性,它不知道是什么字段。可悲的是,它只取决于 xsi:nil 来告诉它。如果它看到一个空的 &lt;Widget name="foo"/&gt; - 它会将其设置为空白/空,而不是完全删除。

class Thing{
        [System.Xml.Serialization.XmlArrayItemAttribute("Widget", IsNullable=true)]
        public List<Widget> Widgets { get; set; } 
}
class Widget{
        [System.Xml.Serialization.XmlAttribute][JsonProperty]
        public string name {get;set;}
        [System.Xml.Serialization.XmlTextAttribute]
        public string Value {get;set;}
}

基本上它不能是&lt;Widget name="foo"&gt;&lt;Value&gt;Bar&lt;/Value&gt;&lt;/Widget&gt;&lt;Widget xsi:nil=true/&gt;&lt;Widget name="foo"/&gt;——只能是&lt;Widget name="foo" xsi:nil="true"/&gt;。责怪这个东西被发送到的处理器(我无法控制)。

那么,它是可序列化的吗?

【问题讨论】:

    标签: c# .net xmlserializer


    【解决方案1】:

    我更新了答案,并再次删除了不相关的代码。实现IXmlSerializable可能会解决这个问题。我只实现了WriteXml接口函数,如果需要你可以实现其他的。代码将更改如下:

    public class Thing:IXmlSerializable
        {      
            public List<Widget> Widgets{get;set;}
    
            public void GetObjectData(SerializationInfo info, StreamingContext context)
            {
                throw new NotImplementedException();
            }
    
            public System.Xml.Schema.XmlSchema GetSchema()
            {
                throw new NotImplementedException();
            }
    
            public void ReadXml(System.Xml.XmlReader reader)
            {
                throw new NotImplementedException();
            }
    
            public void WriteXml(System.Xml.XmlWriter writer)
            {
                writer.WriteStartElement("xsi","Thing", @"http://www.w3.org/2001/XMLSchema-instance");
                foreach (Widget widget in Widgets)
                {
                    if (string.IsNullOrEmpty(widget.Value))
                    {
                        writer.WriteStartElement("widget");
                        writer.WriteAttributeString("Name", widget.Name);
                        writer.WriteAttributeString("xsi", "nil", @"http://www.w3.org/2001/XMLSchema-instance", "true");                                  
                        writer.WriteEndElement();
                    }
                    else
                    {
                        writer.WriteStartElement("widget");
                        writer.WriteAttributeString("Name", widget.Name);
                        writer.WriteString(widget.Value);
                        writer.WriteEndElement();
                    }
                }
                writer.WriteEndElement();
                writer.Flush();
            }
        }
    
        public class Widget
        {
            public string Name{get;set;}
            public string Value { get; set; }
        } 
    }
    
     public static void SaveXml()
            {
                XmlWriterSettings settings= new XmlWriterSettings();
                settings.Indent = true;
                settings.OmitXmlDeclaration = true;                
    
                XmlWriter xmlWriter = XmlWriter.Create(@"c:\test.xml",settings);           
                thing.WriteXml(xmlWriter);
    
            }
    

    序列化后的xml如下所示。widget3的值为null。希望对你有帮助。

       <xsi:Thing xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
          <widget Name="name1">widget1</widget>
          <widget Name="name2">widget2</widget>
          <widget Name="name3" xsi:nil="true" />
        </xsi:Thing>
    

    【讨论】:

    • 我可能写错了 Xmlarray 属性。这是一个接受 IsNullable 的序列化程序提示。不幸的是,我无法改变最终结果。它被馈送到一个并不总是正常工作的又旧又笨拙的处理器。
    • 当我进入办公室并挂断电话时,我将编辑帖子以使其更加清晰,并提供指向我的问题的链接。
    • 我已经更新了帖子以包含更好的信息。
    • 感谢您抽出宝贵时间回答这个问题。看起来这正是我需要的。我已将其标记为已回答。再次感谢。
    • 作为后续,这里是来自 MS 的关于 XMLSerializer 的文档没有按照我的意愿做(即使它显然是有效的 XML 模式):msdn.microsoft.com/en-us/library/ybce7f69%28VS.80%29.aspxThe nil 属性和其他属性.
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多