जवाबों:
आह… कभी नहीं। यह हमेशा सवाल का जवाब देने के बाद खोज है जो उत्तर देता है। मेरी वस्तु जो क्रमबद्ध हो रही हैobj
और पहले से ही परिभाषित है। एक एकल खाली नाम स्थान के साथ XMLSerializerNamespace को जोड़कर चाल करता है।
इस तरह VB में:
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);
q1
बकवास से छुटकारा पाने का कोई तरीका मिला ?
यदि आप अतिरिक्त से छुटकारा पाना चाहते हैं 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/");
यदि आप नाम स्थान को हटाना चाहते हैं, तो आप संस्करण को हटाना चाह सकते हैं, ताकि आप खोज सकें कि मैंने उस कार्यक्षमता को जोड़ा है, इसलिए नीचे दिया गया कोड दोनों करेगा।
मैंने इसे एक सामान्य विधि में भी लपेटा है क्योंकि मैं बहुत बड़ी xml फाइलें बना रहा हूं जो कि मेमोरी में क्रमबद्ध करने के लिए बहुत बड़ी हैं इसलिए मैंने अपनी आउटपुट फ़ाइल को तोड़ दिया है और इसे छोटे "विखंडू" में अनुक्रमित किया है:
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
यूटीएफ -16 एनकोडिंग के लिए चूक जो डाउनस्ट्रीम के मुद्दों को नीचे की ओर ले जा सकती है। using (var reader = XmlReader.Create(stream)){ reader.Read(); }
यह एक अपवाद फेंकता है क्योंकि घोषणा में कहा गया है कि यह UTF-16 है जबकि सामग्री वास्तव में UTF-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);
सही पाए जाने पर BOM का उपयोग करेगा, अन्यथा आपके द्वारा प्रदान किया गया डिफ़ॉल्ट।
मैं इस सहायक वर्ग का सुझाव देता हूं:
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
}
:)
new XmlSerializerNamespaces(new[] {XmlQualifiedName.Empty})
के बजाय new XmlSerializerNamespaces(new[] {new XmlQualifiedName("", "")})
मेरी राय में यह कोड के लिए एक जानबूझकर साफ रास्ता है,।
यदि आप प्रत्येक तत्व के लिए अतिरिक्त xmlns विशेषताओं से छुटकारा पाने में असमर्थ हैं, जब उत्पन्न वर्गों से xml को क्रमबद्ध करना (जैसे: जब xsd.exe का उपयोग किया गया था), तो आपके पास कुछ ऐसा है:
<manyElementWith xmlns="urn:names:specification:schema:xsd:one" />
तब मैं आपके साथ साझा करूंगा कि मेरे लिए क्या काम किया (पिछले उत्तरों का मिश्रण और यहां मुझे क्या मिला )
स्पष्ट रूप से अपने सभी अलग xmlns को निम्नानुसार सेट करें:
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 /> ...
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();
}