এক্সএমএল সিরিয়ালাইজেশন - অ্যারের রেন্ডারিং মূল উপাদানটি অক্ষম করুন


119

আমি কীভাবে সংগ্রহের মূল উপাদানটির রেন্ডারিং অক্ষম করতে পারি?

সিরিয়ালাইজেশন বৈশিষ্ট্যযুক্ত এই শ্রেণি:

[XmlRoot(ElementName="SHOPITEM", Namespace="")]
public class ShopItem
{
    [XmlElement("PRODUCTNAME")]
    public string ProductName { get; set; }       

    [XmlArrayItem("VARIANT")]
    public List<ShopItem> Variants { get; set; }
}

এই এক্সএমএল তৈরি করে:

<SHOPITEM xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
      <PRODUCTNAME>test</PRODUCTNAME>
      <Variants>
          <VARIANT>
              <PRODUCTNAME>hi 1</PRODUCTNAME>
          </VARIANT>
          <VARIANT>
              <PRODUCTNAME>hi 2</PRODUCTNAME>
          </VARIANT>           
      </Variants>        
</SHOPITEM>

আমি <Variants>এখানে উপাদান চাই না । আমার কি করা আবশ্যক?

এছাড়াও আমার মূল উপাদানগুলিতে এক্সসি এবং এক্সএসডি নেমস্পেসের দরকার নেই ...


উত্তর:


184

সংগ্রহের মূল উপাদানটির রেন্ডারিং নিষ্ক্রিয় করতে, আপনাকে অবশ্যই আপনার কোডের [XmlArrayItem]সাথে এট্রিবিউটটি প্রতিস্থাপন করতে হবে [XmlElement]

xsiএবং xsdনেমস্পেসগুলি অপসারণের জন্য , XmlSerializerNamespacesখালি নেমস্পেসের সাথে একটি উদাহরণ তৈরি করুন এবং যখন আপনার অবজেক্টটিকে সিরিয়ালাইজ করার দরকার হবে তখন তা পাস করুন।

এই উদাহরণটি একবার দেখুন:

[XmlRoot("SHOPITEM")]
public class ShopItem
{
    [XmlElement("PRODUCTNAME")]
    public string ProductName { get; set; }

    [XmlElement("VARIANT")] // was [XmlArrayItem]
    public List<ShopItem> Variants { get; set; }
}

// ...

ShopItem item = new ShopItem()
{
    ProductName = "test",
    Variants    = new List<ShopItem>()
    {
        new ShopItem{ ProductName = "hi 1" },
        new ShopItem{ ProductName = "hi 2" }
    }
};

// This will remove the xsi/xsd namespaces from serialization
XmlSerializerNamespaces ns = new XmlSerializerNamespaces();
ns.Add("", "");

XmlSerializer ser = new XmlSerializer(typeof(ShopItem));
ser.Serialize(Console.Out, item, ns);  // Inform the XmlSerializerNamespaces here

আমি এই আউটপুট পেয়েছি:

<?xml version="1.0" encoding="ibm850"?>
<SHOPITEM>
  <PRODUCTNAME>test</PRODUCTNAME>
  <VARIANT>
    <PRODUCTNAME>hi 1</PRODUCTNAME>
  </VARIANT>
  <VARIANT>
    <PRODUCTNAME>hi 2</PRODUCTNAME>
  </VARIANT>
</SHOPITEM>

নোট [XmlArray]উপস্থিত থাকলে অবশ্যই প্রতিস্থাপন করতে হবে ।
ডিবিসি


1

আমি বিশ্বাস করি না ডিফল্ট এক্সএমএল সিরিয়ালাইজেশন (বৈশিষ্ট্য সহ) ব্যবহার করে এই উপাদানটি সরিয়ে ফেলা সম্ভব। আপনি যদি এটি করতে পারতেন তবে আপনার ShopItemশ্রেণিটি ক্রমিক করার ফলে অবজেক্টটির জন্য খারাপভাবে গঠিত xML (কোনও মূল উপাদান নেই) হতে পারে, যা অনুমোদিত নয়।

আপনি যা করতে পারেন তা হ'ল ম্যানুয়ালি প্রয়োগ করা IXmlSerializable। এটি আপনাকে পুনরায় সাজানোর জন্য সূক্ষ্ম ধরণের নিয়ন্ত্রণ প্রদান করবে।

[ সম্পাদনা ] - দুঃখিত - ভুল পাঠান যে আপনি ভেরিয়েন্টগুলি অপসারণের চেষ্টা করছেন, শপ ITIF নয়। তালিকা "বহিরাগত" উপাদানটি সরাতে কেবল একটি [এক্সএমএলএলিমিটি] বৈশিষ্ট্যটির পরিবর্তে এটিকে একটি [এক্সএমএলএলমেন্ট] বৈশিষ্ট্যযুক্ত করে চিহ্নিত করুন। এটি তালিকার এন্ট্রিগুলিকে কেবল কোনও বাহ্যিক উপাদানকে তালিকা মোড়ানো না করে নির্দিষ্ট উপাদানগুলির নামটি ব্যবহার করবে।

নেমস্পেসগুলি অপসারণ করার জন্য, এটি সেরিলিয়াজার নিজেই নিয়ন্ত্রিত হয়, ক্লাসে মার্কআপ নয়। আমি সবেমাত্র লক্ষ্য করেছি যে আমি এই উত্তরটি আপডেট করার সময়, রুবেন্স ফারিয়াস একটি উত্তর সরবরাহ করেছে যা আপনাকে কীভাবে নামের স্থানটি নির্মূল করতে হবে তা দেখায়।


ওহো - আপনার পোস্টটি অপরিবর্তিত - আপনি ভাবা শপ সরানোর চেষ্টা করছেন - কেবল উত্তর সম্পাদনা করুন!
রব লেভাইন
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.