Xml क्रमांकन - शून्य मान छिपाएँ


128

जब एक मानक .NET Xml सीरियल का उपयोग किया जाता है, तो क्या कोई तरीका है जिससे मैं सभी अशक्त मूल्यों को छिपा सकता हूं? नीचे मेरी कक्षा के आउटपुट का एक उदाहरण है। अगर वे अशक्त करने के लिए सेट कर रहे हैं मैं अशक्त पूर्णांकों का उत्पादन नहीं करना चाहता।

वर्तमान Xml उत्पादन:

<?xml version="1.0" encoding="utf-8"?>
<myClass>
   <myNullableInt p2:nil="true" xmlns:p2="http://www.w3.org/2001/XMLSchema-instance" />
   <myOtherInt>-1</myOtherInt>
</myClass>

मैं क्या चाहता हूँ:

<?xml version="1.0" encoding="utf-8"?>
<myClass>
   <myOtherInt>-1</myOtherInt>
</myClass>

जवाबों:


255

आप पैटर्न के साथ एक फ़ंक्शन बना सकते हैं ShouldSerialize{PropertyName}जो XmlSerializer को बताता है कि क्या इसे सदस्य को अनुक्रमित करना चाहिए या नहीं।

उदाहरण के लिए, यदि आपकी कक्षा की संपत्ति कहलाती है, तो आपके MyNullableIntपास हो सकती है

public bool ShouldSerializeMyNullableInt() 
{
  return MyNullableInt.HasValue;
}

यहाँ एक पूर्ण नमूना है

public class Person
{
  public string Name {get;set;}
  public int? Age {get;set;}
  public bool ShouldSerializeAge()
  {
    return Age.HasValue;
  }
}

निम्नलिखित कोड के साथ सीरियल किया गया

Person thePerson = new Person(){Name="Chris"};
XmlSerializer xs = new XmlSerializer(typeof(Person));
StringWriter sw = new StringWriter();
xs.Serialize(sw, thePerson);

Followng XML में परिणाम - सूचना है कि कोई आयु नहीं है

<Person xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <Name>Chris</Name>
</Person>

9
एक शब्द: बहुत बढ़िया! एमएसडीएन कंधे सेशियल
स्कीन

7
कंधे के आकार का पैटर्न केवल तभी काम करता है, यदि संपत्ति को एक्सएमएलअट्रीब्यूट-विशेषता के साथ चिह्नित नहीं किया गया है (मुझे लगा कि यह काम करना चाहिए, क्योंकि एक विशेषता वैकल्पिक हो सकती है, लेकिन ऐसा नहीं है)।
मैज

@ मज्ज़े दिलचस्प, मैंने वो कोशिश नहीं की है। मुझे भी लगता था कि यह काम करेगा।
क्रिस टेलर

@ क्रिसट्रेलर हाँ; मैंने वही मान लिया। मुश्किल बात यह थी कि XmlSerializer उदाहरण का निर्माण विफल हो गया था (टाइप को प्रतिबिंबित करते समय एक त्रुटि के कारण) जब तक कि मैंने XmlAttribute को अशक्त अंतर-गुण से हटा नहीं दिया।
Matze

2
@PierredeLESPINAY - विज़ुअल स्टूडियो 2015 और ऊपर से, आप उपयोग कर सकते हैं: सार्वजनिक बूल कंधेसेरलाइज़एज () => आयु.हैस्वल्यू;
RooiWillie

34

इसके अतिरिक्त क्रिस टेलर ने जो लिखा है: यदि आपके पास एक विशेषता के रूप में कुछ धारावाहिक है, तो आपके पास अपनी श्रेणी पर एक संपत्ति हो सकती है जिसे {PropertyName}Specifiedनियंत्रित करने के लिए नाम दिया गया है यदि यह धारावाहिक रूप में होना चाहिए। कोड में:

public class MyClass
{
    [XmlAttribute]
    public int MyValue;

    [XmlIgnore]
    public bool MyValueSpecified;
}

केयरफुल रहें, {PropertyName}Specifiedविशेषताएँ टाइप बूल की होनी चाहिए।
sinsedrix

30

यह एक संपत्ति कहा जाता है मौजूद है XmlElementAttribute.IsNullable

यदि इस्नेबल प्रॉपर्टी को सही पर सेट किया जाता है, तो xsi: nil विशेषता वर्ग के सदस्यों के लिए उत्पन्न होती है, जिन्हें एक अशक्त संदर्भ में सेट किया गया है।

निम्न उदाहरण इसके साथ XmlElementAttributeलागू करने के लिए एक क्षेत्र दिखाता है , और IsNullable संपत्ति झूठी है।

public class MyClass
{
   [XmlElement(IsNullable = false)]
   public string Group;
}

XmlElementAttributeक्रमांकन आदि में नाम बदलने के लिए आप अन्य के लिए एक नज़र रख सकते हैं ।


11
दुर्भाग्य से, यह केवल संदर्भ प्रकारों के लिए काम करता है, न कि मूल्य प्रकारों या उनके अशक्त समकक्षों के लिए।
विंसेंट सेल्स

3
@VincentSels सही है। MSDN कहता है: आप एक मूल्य के रूप में टाइप किए गए सदस्य के लिए IsNullable संपत्ति को लागू नहीं कर सकते क्योंकि मूल्य प्रकार में शून्य नहीं हो सकता। साथ ही, आप इस गुण को अशक्त मान प्रकारों के लिए गलत पर सेट नहीं कर सकते हैं। जब इस प्रकार के अशक्त होते हैं, तो उन्हें xsi: nil to true पर सेट करके क्रमबद्ध किया जाएगा।
बुविविर

12

आप कुछ डिफ़ॉल्ट मानों को परिभाषित कर सकते हैं और यह फ़ील्ड को क्रमबद्ध होने से रोकता है।

    [XmlElement, DefaultValue("")]
    string data;

    [XmlArray, DefaultValue(null)]
    List<string> data;

दुर्भाग्य से, यह अशक्त मूल्य प्रकारों के लिए काम नहीं करता है
बुबी

2

मैं बिना किसी ऑटो-जनित टैग के साथ अपना स्वयं का xml बनाना पसंद करता हूं। इसमें मैं अशक्त मानों के साथ नोड्स बनाने की उपेक्षा कर सकता हूं:

public static string ConvertToXML<T>(T objectToConvert)
    {
        XmlDocument doc = new XmlDocument();
        XmlNode root = doc.CreateNode(XmlNodeType.Element, objectToConvert.GetType().Name, string.Empty);
        doc.AppendChild(root);
        XmlNode childNode;

        PropertyDescriptorCollection properties = TypeDescriptor.GetProperties(typeof(T));
        foreach (PropertyDescriptor prop in properties)
        {
            if (prop.GetValue(objectToConvert) != null)
            {
                childNode = doc.CreateNode(XmlNodeType.Element, prop.Name, string.Empty);
                childNode.InnerText = prop.GetValue(objectToConvert).ToString();
                root.AppendChild(childNode);
            }
        }            

        return doc.OuterXml;
    }

1
private static string ToXml(Person obj)
{
  XmlSerializerNamespaces namespaces = new XmlSerializerNamespaces();
  namespaces.Add(string.Empty, string.Empty);

  string retval = null;
  if (obj != null)
  {
    StringBuilder sb = new StringBuilder();
    using (XmlWriter writer = XmlWriter.Create(sb, new XmlWriterSettings() { OmitXmlDeclaration = true }))
    {
      new XmlSerializer(obj.GetType()).Serialize(writer, obj,namespaces);
    }
    retval = sb.ToString();
  }
  return retval;
}

1

मेरे मामले में अशक्त चर / तत्व सभी स्ट्रिंग प्रकार थे। इसलिए, मैंने केवल एक चेक किया और उन्हें स्ट्रिंग सौंपा। NULL के मामले में खाली करें। इस तरह मैंने अनावश्यक नील और xmlns विशेषताओं (p3: nil = "true" xmlns: p3 = "http://www.w3.org/2001/XMLSchema-instance) से छुटकारा पा लिया

// Example:

myNullableStringElement = varCarryingValue ?? string.Empty

// OR

myNullableStringElement = myNullableStringElement ?? string.Empty

1
यह समाधान बहुत सीमित है और केवल स्ट्रिंग के साथ काम करता है। अन्य प्रकारों के लिए खाली स्ट्रिंग अभी भी एक मूल्य है। कुछ पार्सर्स विशेषता खोजने का प्रयास करते हैं और यदि पाया गया तो मान को लक्ष्य प्रकार में बदलने का प्रयास करते हैं। ऐसे पार्सर्स के लिए, लापता विशेषता का मतलब अशक्त है और यदि विशेषता है तो इसका एक वैध मूल्य होना चाहिए।
ज़ाफ़ारियुसफ़ी
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.