Suppress XSI: NIL ولكن لا يزال تظهر عنصرا فارغا عند تسلسل .NET

StackOverflow https://stackoverflow.com/questions/1710107

سؤال

لدي AC # فئة تحتوي على 20+ خصائص سلسلة. وضعت حوالي ربع تلك إلى القيمة الفعلية. أرغب في تسلسل الفصل والحصول على إخراج

<EmptyAttribute></EmptyAttribute>

للحصول على عقار

public string EmptyAttribute {get;set;}

أنا لا أريد أن يكون الإخراج

<EmptyAttribute xsi:nil="true"></EmptyAttribute>

أنا أستخدم الطبقة التالية

public class XmlTextWriterFull : XmlTextWriter
{
    public XmlTextWriterFull(string filename) : base(filename,Encoding.UTF8) { }

    public override void WriteEndElement()
    {
        base.WriteFullEndElement();
        base.WriteRaw(Environment.NewLine);
    }
}

حتى أتمكن من الحصول على العلامات الكاملة. أنا فقط لا أعرف كيفية التخلص من XSI: لا شيء.

هل كانت مفيدة؟

المحلول 2

كنت فعلا قادرة على معرفة ذلك. أنا أعرف أنها قليلا من الاختراق في بعض النواحي ولكن هذه هي الطريقة التي حصلت عليها للعمل

 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);

آمل أن يساعد هذا شخص آخر

نصائح أخرى

الطريق للحصول على 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, ، يجب أن يكون لديك الإخراج التالي:

<MyClassWithNullableProp>
    <MyEmptyString />
     <MyEmptyNullableFloat />
</MyClassWithNullableProp>

آمل أن يدل هذا بوضوح كيف المدمج في .NET Framework XmlSerializer يمكن استخدامها لتسلسل الخصائص إلى عنصر فارغ، حتى عندما تكون قيمة الخاصية فارغة (أو بعض القيمة الأخرى التي لا تريد التسلسل). بالإضافة إلى ذلك، لقد أظهرت كيف يمكنك التأكد من ذلك null الخصائص ليست تسلسل على الإطلاق. شيء واحد يجب ملاحظته، إذا قمت بتطبيق XmlElementAttribute وتعيين IsNullable خاصية تلك السمة ل true, ، ثم هذه الخاصية سوف تسلسل مع xsi:nil السمة عندما يكون العقار هو null (ما لم تغلب في مكان آخر).

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top