抑制xsi:nil但在.Net中序列化时仍然显示空元素

我的ac #class有20多个字符串属性。 我将其中的四分之一设置为实际值。 我想序列化类并获得输出

 

对于一个财产

 public string EmptyAttribute {get;set;} 

我不希望输出

  

我正在使用以下课程

 public class XmlTextWriterFull : XmlTextWriter { public XmlTextWriterFull(string filename) : base(filename,Encoding.UTF8) { } public override void WriteEndElement() { base.WriteFullEndElement(); base.WriteRaw(Environment.NewLine); } } 

这样我就可以得到完整的标签。 我只是不知道如何摆脱xsi:nil。

XmlSerializer序列化属性而不添加xsi:nil="true"属性的方法如下所示:

 [XmlRoot("MyClassWithNullableProp", Namespace="urn:myNamespace", IsNullable = false)] public class MyClassWithNullableProp { public MyClassWithNullableProp( ) { this._namespaces = new XmlSerializerNamespaces(new XmlQualifiedName[] { new XmlQualifiedName(string.Empty, "urn:myNamespace") // Default Namespace }); } [XmlElement("Property1", Namespace="urn:myNamespace", IsNullable = false)] public string Property1 { get { // To make sure that no element is generated, even when the value of the // property is an empty string, return null. return string.IsNullOrEmpty(this._property1) ? null : this._property1; } set { this._property1 = value; } } private string _property1; // To do the same for value types, you need a "helper property, as demonstrated below. // First, the regular property. [XmlIgnore] // The serializer won't serialize this property properly. public int? MyNullableInt { get { return this._myNullableInt; } set { this._myNullableInt = value; } } private int? _myNullableInt; // And now the helper property that the serializer will use to serialize it. [XmlElement("MyNullableInt", Namespace="urn:myNamespace", IsNullable = false)] public string XmlMyNullableInt { get { return this._myNullableInt.HasValue? this._myNullableInt.Value.ToString() : null; } set { this._myNullableInt = int.Parse(value); } // You should do more error checking... } // Now, a string property where you want an empty element to be displayed, but no // xsi:nil. [XmlElement("MyEmptyString", Namespace="urn:myNamespace", IsNullable = false)] public string MyEmptyString { get { return string.IsNullOrEmpty(this._myEmptyString)? string.Empty : this._myEmptyString; } set { this._myEmptyString = value; } } private string _myEmptyString; // Now, a value type property for which you want an empty tag, and not, say, 0, or // whatever default value the framework gives the type. [XmlIgnore] public float? MyEmptyNullableFloat { get { return this._myEmptyNullableFloat; } set { this._myEmptyNullableFloat = value; } } private float? _myEmptyNullableFloat; // The helper property for serialization. public string XmlMyEmptyNullableFloat { get { return this._myEmptyNullableFloat.HasValue ? this._myEmptyNullableFloat.Value.ToString() : string.Empty; } set { if (!string.IsNullOrEmpty(value)) this._myEmptyNullableFloat = float.Parse(value); } } [XmlNamespaceDeclarations] public XmlSerializerNamespaces Namespaces { get { return this._namespaces; } } private XmlSerializerNamespaces _namespaces; } 

现在,实例化该类并将其序列化。

 // I just wanted to show explicitly setting all the properties to null... MyClassWithNullableProp myClass = new MyClassWithNullableProp( ) { Property1 = null, MyNullableInt = null, MyEmptyString = null, MyEmptyNullableFloat = null }; // Serialize it. // You'll need to setup some backing store for the text writer below... // a file, memory stream, something... XmlTextWriter writer = XmlTextWriter(...) // Instantiate a text writer. XmlSerializer xs = new XmlSerializer(typeof(MyClassWithNullableProp), new XmlRootAttribute("MyClassWithNullableProp") { Namespace="urn:myNamespace", IsNullable = false } ); xs.Serialize(writer, myClass, myClass.Namespaces); 

检索XmlTextWriter的内容后,您应该具有以下输出:

     

我希望这清楚地演示了如何使用内置的.NET Framework XmlSerializer将属性序列化为空元素,即使属性值为null(或者您不想序列化的其他值)。 另外,我已经展示了如何确保null属性根本没有被序列化。 需要注意的一点是,如果应用XmlElementAttribute并将该属性的IsNullable属性设置为true ,那么当属性为null时,该属性将使用xsi:nil属性进行序列化(除非在其他地方覆盖)。

我实际上能够弄清楚这一点。 我在某些方面知道它有点像黑客,但这就是我如何让它工作

  System.Xml.Serialization.XmlSerializer x = new System.Xml.Serialization.XmlSerializer(header.GetType()); XmlTextWriterFull writer = new XmlTextWriterFull(FilePath); x.Serialize(writer, header); writer.Flush(); writer.BaseStream.Dispose(); string xml = File.ReadAllText(FilePath); xml = xml.Replace(" xsi:nil=\"true\"", ""); File.WriteAllText(FilePath, xml); 

希望这有助于其他人