यदि आप XmlRoot के साथ अपने मॉडल को सजाने के इच्छुक हैं, तो यह करने का एक अच्छा तरीका है। मान लीजिए कि आपके पास दरवाजे के साथ एक कार है। डिफ़ॉल्ट WebAPI विन्यास की तरह कुछ वापस आ जाएगी:
<car>
<doors>
<door>
<color>black</color>
</door>
</doors>
</car>
यहाँ मॉडल है:
<car
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<doors>
<door>
<color>black</color>
</door>
</doors>
</car>
यह तुम क्या चाहते है
[XmlRoot("car")]
public class Car
{
[XmlArray("doors"), XmlArrayItem("door")]
public Door[] Doors { get; set; }
}
आप क्या करना है एक कस्टम XmlFormatter बनाने है XmlRoot विशेषता में परिभाषित कोई नामस्थान नहीं होने पर उसमें एक खाली नामस्थान होगा। किसी कारण से, डिफ़ॉल्ट स्वरूपक हमेशा दो डिफ़ॉल्ट नामस्थान जोड़ता है।
public class CustomNamespaceXmlFormatter : XmlMediaTypeFormatter
{
public override Task WriteToStreamAsync(Type type, object value, Stream writeStream, HttpContent content,
TransportContext transportContext)
{
try
{
var xns = new XmlSerializerNamespaces();
foreach (var attribute in type.GetCustomAttributes(true))
{
var xmlRootAttribute = attribute as XmlRootAttribute;
if (xmlRootAttribute != null)
{
xns.Add(string.Empty, xmlRootAttribute.Namespace);
}
}
if (xns.Count == 0)
{
xns.Add(string.Empty, string.Empty);
}
var task = Task.Factory.StartNew(() =>
{
var serializer = new XmlSerializer(type);
serializer.Serialize(writeStream, value, xns);
});
return task;
}
catch (Exception)
{
return base.WriteToStreamAsync(type, value, writeStream, content, transportContext);
}
}
}
करने के लिए आखिरी बात WebApiContext में नया फॉर्मेटर जोड़ना है। पुरानी XmlMediaTypeFormatter
public static class WebApiContext
{
public static void Register(HttpConfiguration config)
{
...
config.Formatters.Clear();
config.Formatters.Add(new CustomNamespaceXmlFormatter{UseXmlSerializer=true});
...
}
}
काम करता है आप कुछ इस तरह की कोशिश कर सकते: http: // stackoverflow।कॉम/प्रश्न/2 9 352015/कैसे-कर-आई-निर्माण-कस्टम-एक्सएमएल-नेमस्पेस-विशेषताएं-कब-उपभोग-ए-विरासत-साबुन-से –