سؤال

هل هناك طريقة تسلسل كائن في .صافي بدون مساحات الأسماء XML تلقائيا التسلسلية أيضا ؟ يبدو أن افتراضيا .صافي يعتقد XSI و XSD مساحات ينبغي أن تدرج ، ولكن لا أريد لهم هناك.

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

المحلول

والخبر ... فما باللك. انها دائما البحث بعد طرح السؤال الذي ينتج الجواب. وجوه بلدي الذي يتم تسلسل هو obj ولقد تم تعريف. إضافة XMLSerializerNamespace مع مساحة فارغة واحد لجمع الحيلة.

في VB مثل هذا:

Dim xs As New XmlSerializer(GetType(cEmploymentDetail))
Dim ns As New XmlSerializerNamespaces()
ns.Add("", "")

Dim settings As New XmlWriterSettings()
settings.OmitXmlDeclaration = True

Using ms As New MemoryStream(), _
    sw As XmlWriter = XmlWriter.Create(ms, settings), _
    sr As New StreamReader(ms)
xs.Serialize(sw, obj, ns)
ms.Position = 0
Console.WriteLine(sr.ReadToEnd())
End Using

وفي C # مثل هذا:

//Create our own namespaces for the output
XmlSerializerNamespaces ns = new XmlSerializerNamespaces();

//Add an empty namespace and empty value
ns.Add("", "");

//Create the serializer
XmlSerializer slz = new XmlSerializer(someType);

//Serialize the object with our own namespaces (notice the overload)
slz.Serialize(myXmlTextWriter, someObject, ns);

نصائح أخرى

إذا كنت تريد التخلص من xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" خارج وxmlns:xsd="http://www.w3.org/2001/XMLSchema"، ولكن لا يزال الحفاظ على مساحة xmlns="http://schemas.YourCompany.com/YourSchema/" الخاصة، يمكنك استخدام نفس الرمز على النحو الوارد أعلاه باستثناء هذا التغيير بسيط:

//  Add lib namespace with empty prefix  
ns.Add("", "http://schemas.YourCompany.com/YourSchema/");   

إذا كنت ترغب في إزالة مساحة الاسم قد تحتاج أيضا إلى إزالة الإصدار، لإنقاذ ما كنت تبحث عن واضاف لقد تلك الوظيفة حتى رمز أدناه سوف تفعل كليهما.

ولقد ملفوفة أيضا في طريقة عامة كما أنا خلق ملفات XML كبيرة جدا والتي تكون كبيرة جدا لتسلسل في الذاكرة حتى لقد كسر ملف الإخراج إلى أسفل وتسلسل في "قطع" أصغر:

    public static string XmlSerialize<T>(T entity) where T : class
    {
        // removes version
        XmlWriterSettings settings = new XmlWriterSettings();
        settings.OmitXmlDeclaration = true;

        XmlSerializer xsSubmit = new XmlSerializer(typeof(T));
        using (StringWriter sw = new StringWriter())
        using (XmlWriter writer = XmlWriter.Create(sw, settings))
        {
            // removes namespace
            var xmlns = new XmlSerializerNamespaces();
            xmlns.Add(string.Empty, string.Empty);

            xsSubmit.Serialize(writer, entity, xmlns);
            return sw.ToString(); // Your XML
        }
    }

وأقترح هذه الفئة المساعد:

public static class Xml
{
    #region Fields

    private static readonly XmlWriterSettings WriterSettings = new XmlWriterSettings {OmitXmlDeclaration = true, Indent = true};
    private static readonly XmlSerializerNamespaces Namespaces = new XmlSerializerNamespaces(new[] {new XmlQualifiedName("", "")});

    #endregion

    #region Methods

    public static string Serialize(object obj)
    {
        if (obj == null)
        {
            return null;
        }

        return DoSerialize(obj);
    }

    private static string DoSerialize(object obj)
    {
        using (var ms = new MemoryStream())
        using (var writer = XmlWriter.Create(ms, WriterSettings))
        {
            var serializer = new XmlSerializer(obj.GetType());
            serializer.Serialize(writer, obj, Namespaces);
            return Encoding.UTF8.GetString(ms.ToArray());
        }
    }

    public static T Deserialize<T>(string data)
        where T : class
    {
        if (string.IsNullOrEmpty(data))
        {
            return null;
        }

        return DoDeserialize<T>(data);
    }

    private static T DoDeserialize<T>(string data) where T : class
    {
        using (var ms = new MemoryStream(Encoding.UTF8.GetBytes(data)))
        {
            var serializer = new XmlSerializer(typeof (T));
            return (T) serializer.Deserialize(ms);
        }
    }

    #endregion
}

:)

إذا كنت غير قادر على التخلص من خارج xmlns سمات كل عنصر, عندما التسلسلية إلى xml من الفئات التي تم إنشاؤها (على سبيل المثال:عندما xsd.exe كانت تستخدم) ، بحيث يكون لديك شيء من هذا القبيل:

<manyElementWith xmlns="urn:names:specification:schema:xsd:one" />

ثم أود أن أطلعكم على ما عملت بالنسبة لي (مزيج من الإجابات السابقة و ما وجدت هنا)

صراحة كل ما تبذلونه من مختلف xmlns على النحو التالي:

Dim xmlns = New XmlSerializerNamespaces()
xmlns.Add("one", "urn:names:specification:schema:xsd:one")
xmlns.Add("two",  "urn:names:specification:schema:xsd:two")
xmlns.Add("three",  "urn:names:specification:schema:xsd:three")

ثم تمر عليه إلى تسلسل

serializer.Serialize(writer, object, xmlns);

سيكون لديك ثلاث مساحات أعلن في العنصر الجذر و لا يلزم ولدت في العناصر الأخرى التي سوف تكون مسبوقة وفقا لذلك

<root xmlns:one="urn:names:specification:schema:xsd:one" ... />
   <one:Element />
   <two:ElementFromAnotherNameSpace /> ...
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top