एक्सएमएल सीरियलाइज़ेशन - सरणी का रूट तत्व अक्षम करना


119

क्या मैं किसी तरह संग्रह के मूल तत्व के प्रतिपादन को निष्क्रिय कर सकता हूं?

क्रमबद्धता विशेषताओं वाला यह वर्ग:

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

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

इस XML उत्पन्न करता है:

<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>यहाँ तत्व नहीं चाहिए । मुझे क्या करना चाहिए?

इसके अलावा मुझे रूट एलीमेंट में xsi और xsd नामस्थान की जरूरत नहीं है ...


जवाबों:


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]वर्तमान में भी बदलना होगा।
dbc


1

मेरा मानना ​​है कि डिफ़ॉल्ट xml क्रमांकन (विशेषताओं के साथ) का उपयोग करके इस तत्व को निकालना संभव है। यदि आप ऐसा कर सकते हैं, तो अपनी ShopItemकक्षा को क्रमबद्ध करने से ऑब्जेक्ट के लिए बुरी तरह से गठित xml (कोई मूल तत्व) नहीं होगा, जिसकी अनुमति नहीं है।

हालांकि आप क्या कर सकते हैं, मैन्युअल रूप से लागू होता है IXmlSerializable। इससे आपको ठीक-ठाक नियंत्रण मिल जाएगा।

[ संपादित करें ] - क्षमा करें - गलत है कि आप वेरिएंट को हटाने की कोशिश कर रहे थे, न कि SHOPITEM। सूची "बाहरी" तत्व को निकालने के लिए, इसे [XmlArrayItem] विशेषता के बजाय [XmlElement] विशेषता के साथ चिह्नित करें। यह सूची प्रविष्टियों को केवल एक बाहरी तत्व में सूची को लपेटे बिना निर्दिष्ट तत्व नाम का उपयोग करने का कारण होगा।

नेमस्पेस को हटाने के लिए, यह स्वयं सर्लिइज़र द्वारा नियंत्रित किया जाता है, न कि क्लास पर मार्कअप। मैंने अभी ध्यान दिया है कि जब मैंने इस उत्तर को अपडेट किया है, रुबेंस फ़ारियास ने एक उत्तर दिया है जो आपको बताता है कि नाम स्थान को कैसे समाप्त किया जाए।


उफ़ - आपकी पोस्ट को गलत समझा - सोचा कि आप SHOPITEM को हटाने की कोशिश कर रहे थे - बस संपादन का जवाब!
रोब लेविन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.