এক্সএমএলএন = "..." না পেয়ে কীভাবে কোনও বস্তুটি এক্সএমএলকে সিরিয়ালাইজ করা যায়?


109

এক্সএমএল নেমস্পেসগুলি ছাড়াও স্বয়ংক্রিয়ভাবে সিরিয়ালাইজিং করা .NET- এ কোনও অবজেক্টের সিরিয়ালাইজ করার কি উপায় আছে? এটি ডিফল্ট হিসাবে মনে হয় .NET XSI এবং XSD নেমস্পেসগুলি অন্তর্ভুক্ত করা উচিত বলে বিশ্বাস করে, তবে আমি সেগুলি সেখানে চাই না।

উত্তর:


142

আহ ... কিছু নয়। প্রশ্ন উত্থাপিত হওয়ার পরে এটি সর্বদা অনুসন্ধান করে যা উত্তর দেয়। আমার অবজেক্টটি সিরিয়ালযুক্ত হচ্ছে objএবং এটি ইতিমধ্যে সংজ্ঞায়িত করা হয়েছে। সংগ্রহের জন্য একটি একক ফাঁকা নেমস্পেসের সাথে একটি এক্সএমএলসিরালাইজারনেসস্পেস যুক্ত করা কৌশলটি কার্যকর করে।

ভিবিতে এটির মতো:

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

সি # তে এইভাবে:

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

12
আমি এটি ভিবিতে চেষ্টা করেছি, এক্সএসআই এবং এক্সএসডি বৈশিষ্ট্যগুলি অদৃশ্য হয়ে গেছে তবে xmlns: q12 =, d3p1: টাইপ এবং xMLns: d3p1 এর মতো বৈশিষ্ট্য উপস্থিত হয়েছে।
মিডেলকে

16
আমি সি # সংস্করণটি চেষ্টা করেছি এবং এটি এক্সএসআই এবং এক্সএসডি সরিয়ে দিয়েছে তবে সমস্ত এক্সএমএল ট্যাগ নামের সাথে কিউ 1 এর একটি উপসর্গ যুক্ত করেছে, যা আমি চাইনি। দেখে মনে হচ্ছে যে সি # উদাহরণটি অসম্পূর্ণ, মাইএক্সএমএল টেক্সট রাইটারকে উল্লেখ করে যা আমি ধরে নিয়েছি ভিবি উদাহরণ হিসাবে একইভাবে আরম্ভ করা দরকার।
redtetrahedron

1
@redtetrahedron আপনি কি এই জঞ্জাল থেকে মুক্তি পাওয়ার কোনও উপায় খুঁজে পেয়েছেন q1?
ক্রাশ করুন

উত্তর পড়ুন stackoverflow.com/questions/31946240/... যদি Q1 যেমন ফাঁকা নামস্থান যোগ
অনিরুদ্ধ

20

আপনি যদি অতিরিক্ত থেকে মুক্তি পেতে 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/");   

13

আপনি যদি নেমস্পেসটি সরাতে চান তবে আপনি সংস্করণটিও মুছে ফেলতে চাইতে পারেন, আপনাকে অনুসন্ধানে সংরক্ষণ করতে আমি সেই কার্যকারিতাটি যুক্ত করেছি যাতে নীচের কোডটি উভয়ই করে।

আমি এটিকে জেনেরিক পদ্ধতিতেও আবৃত করেছি কারণ আমি খুব বড় এক্সএমএল ফাইল তৈরি করছি যা স্মৃতিতে সিরিয়ালাইজ করার জন্য খুব বড় নয় তাই আমি আমার আউটপুট ফাইলটি ভেঙে ফেলেছি এবং এটি ছোট "খণ্ডে" সিরিয়ালাইজ করেছি:

    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
        }
    }

সাবধান, StringWriterইউটিএফ -১ Enc এনকোডিংয়ের ডিফল্ট যা ডিস্ট্রিয়ালাইজেশনের সমস্যাটিকে প্রবাহিত করতে পারে। using (var reader = XmlReader.Create(stream)){ reader.Read(); }এটি একটি ব্যতিক্রম ছুঁড়েছে কারণ ঘোষণাপত্রে এটি ইউটিএফ -16 রয়েছে যখন সামগ্রীটি আসলে ইউটিএফ -8 হিসাবে লেখা হয়েছিল। System.Xml.XmlException: 'There is no Unicode byte order mark. Cannot switch to Unicode.'
টাইলার স্ট্যান্ডিশম্যান

এটি ঘুরে দেখার জন্য এবং এখনও ব্যবহার করতে XmlReader, আপনি var streamReader = new StreamReader(stream, System.Text.Encoding.UTF8, true);সত্য ব্যবহার করতে পারেন যদি পাওয়া যায় তবে বিওএম ব্যবহার করবেন, অন্যথায় আপনি যে ডিফল্ট সরবরাহ করেন।
টাইলার স্ট্যান্ডিশম্যান

9

আমি এই সহায়ক শ্রেণীর পরামর্শ দিই:

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
}

:)


দুর্দান্ত উত্তর :) আমি এই লাইন প্রবাহটিও যুক্ত করেছি osition অবস্থান = 0; এবং আমার সমাধানটিতে পুরো স্ট্রিমটি ফিরিয়ে দিয়েছে .. প্রত্যাশার মতো কাজ করেছে - সমস্ত হ্রাসের ট্যাগগুলি সরানো হয়েছিল
ymz

সিরিয়ালাইজার কলটিতে নেমস্পেস যুক্তি যুক্ত করা আমার পক্ষে ডিফল্ট নেমস্পেসগুলি সরিয়ে ফেলতে কাজ করেছিল। new XmlSerializerNamespaces(new[] {XmlQualifiedName.Empty})পরিবর্তে লিখিতভাবে new XmlSerializerNamespaces(new[] {new XmlQualifiedName("", "")})এটি কোড করার ইচ্ছাকৃতভাবে পরিষ্কার উপায়, আমার মতে।
সানকাট 2000

5

উত্পাদিত শ্রেণি থেকে এক্সএমএল সিরিয়ালকরণ করার সময় আপনি যদি প্রতিটি উপাদানটির জন্য অতিরিক্ত এক্সএমএলএন বৈশিষ্ট্যগুলি থেকে মুক্তি পেতে অক্ষম হন (উদাহরণস্বরূপ: যখন xsd.exe ব্যবহৃত হত) তবে আপনার মতো কিছু রয়েছে:

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

তারপরে আমি আমার সাথে কী কাজ করেছি তা আপনার সাথে ভাগ করে নেব (পূর্ববর্তী উত্তরের মিশ্রণ এবং আমি এখানে কী পেয়েছি )

আপনার সমস্ত বিভিন্ন এক্সএমএনএস স্পষ্টভাবে সেট করুন:

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 /> ...

0
        XmlWriterSettings settings = new XmlWriterSettings
        {
            OmitXmlDeclaration = true
        };

        XmlSerializerNamespaces ns = new XmlSerializerNamespaces();
        ns.Add("", "");

        StringBuilder sb = new StringBuilder();

        XmlSerializer xs = new XmlSerializer(typeof(BankingDetails));

        using (XmlWriter xw = XmlWriter.Create(sb, settings))
        {
            xs.Serialize(xw, model, ns);
            xw.Flush();
            return sb.ToString();
        }
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.