2010-05-14 11 views
6

मैं के साथ सभी तत्वों, उपसर्ग के इस तरह एक XML फ़ाइल बनाने के लिए:XmlSerializer उत्पादन एक्सएमएल कोई नामस्थान उपसर्ग

<ps:Request num="123" xmlns:ps="www.ladieda.com"> 
    <ps:ClientId>5566</ps:ClientId> 
<ps:Request> 

जब मैं अपने वस्तु को क्रमानुसार, सी # चालाक है और इस करता है:

<Request num="123" xmlns="www.ladieda.com"> 
    <ClientId>5566</ClientId> 
<Request> 

यह अच्छा है, क्योंकि ps: आवश्यक नहीं है।

लेकिन क्या सभी उपसर्गों को क्रमबद्ध करने के लिए सी # को मजबूर करने का कोई तरीका है?

String XmlizedString = null; 
MemoryStream memoryStream = new MemoryStream(); 
XmlSerializer xs = new XmlSerializer(pObject.GetType()); 
XmlTextWriter xmlTextWriter = new XmlTextWriter(memoryStream, Encoding.UTF8); 

xs.Serialize(xmlTextWriter, pObject); 
memoryStream = (MemoryStream)xmlTextWriter.BaseStream; 
XmlizedString = UTF8ByteArrayToString(memoryStream.ToArray()); 
return XmlizedString; 


private String UTF8ByteArrayToString(Byte[] characters) 
{ 
    UTF8Encoding encoding = new UTF8Encoding(); 
    String constructedString = encoding.GetString(characters); 
    return (constructedString); 
} 
+0

BTW, यह अपने नाम स्थान में भूल नहीं है। आपका नेमस्पेस सही ढंग से क्रमबद्ध है। यह बस एक उपसर्ग का उपयोग नहीं कर रहा है, जो समझ में आता है, क्योंकि आपने इसे उपयोग करने के लिए एक उपसर्ग नहीं बताया था। –

उत्तर

15

सबसे पहले, यदि आपका स्ट्रिंग के उपभोक्ता एक्सएमएल प्रसंस्करण कर रहे थे, तो वे उपसर्ग के बारे में परवाह नहीं है, क्योंकि यह नहीं करता है:

मेरे serialize कोड इस (भेजे वस्तु pObject के लिए) है कोई फर्क नहीं पड़ता (एक्सएमएल के लिए)। शायद वे एक्सएमएल को नहीं समझते हैं, और सोचते हैं कि वे एक स्ट्रिंग को संसाधित कर रहे हैं (जिसमें हर तत्व पर स्ट्रिंग "ps:" होनी चाहिए)। पदावनत XmlTextWriter वर्ग का उपयोग कर

XmlSerializer xs = new XmlSerializer(pObject.GetType()); 
using (MemoryStream memoryStream = new MemoryStream()) 
{ 
    XmlWriterSettings settings = new XmlWriterSettings() 
    { 
     Encoding = Encoding.UTF8 
    }; 
    using (XmlWriter writer = XmlWriter.Create(memoryStream, settings)) 
    { 
     xs.Serialize(writer, pObject); 
    } 
    return Encoding.UTF8.GetString(memoryStream.ToArray()); 
} 

यह ठीक से धारा और XmlWriter के निपटान होगा अगर एक अपवाद फेंक दिया जाता है, बंद हो जाता है, और अभी तक अभी भी एक रिटर्न:

सभी का दूसरा, आप अपने कोड थोड़ा बदलना चाहिए यूटीएफ -8 के लिए लिखित एक्सएमएल युक्त स्ट्रिंग।

अंत में, उपसर्ग नियंत्रित करने के लिए, "How to: Qualify XML Element and XML Attribute Names" देखें:

XmlSerializerNamespaces myNamespaces = new XmlSerializerNamespaces(); 
myNamespaces.Add("ps", "www.ladieda.com"); 

XmlSerializer xs = new XmlSerializer(pObject.GetType()); 
using (MemoryStream memoryStream = new MemoryStream()) 
{ 
    XmlWriterSettings settings = new XmlWriterSettings() 
    { 
     Encoding = Encoding.UTF8 
    }; 
    using (XmlWriter writer = XmlWriter.Create(memoryStream, settings)) 
    { 
     xs.Serialize(writer, pObject, myNamespaces); 
    } 
    return Encoding.UTF8.GetString(memoryStream.ToArray()); 
} 
+2

+1 उत्कृष्ट उत्तर - महान स्पष्टीकरण और अच्छा, उपयोग करने में आसान कोड नमूने। –

+0

बढ़िया! यह बॉक्स से बाहर काम करता है! धन्यवाद दोस्त। – Michel

+0

बहुत अजीब: यह कोड एक्सएमएल स्ट्रिंग के पहले अक्षर के रूप में एक दृश्यमान चरित्र (डीबगर में) उत्पन्न करता है। यदि आप इस चरित्र के बिना उसी स्ट्रिंग के साथ इसकी तुलना करते हैं, या यदि आप html.encode करते हैं, तो यह केवल पॉप अप हो जाता है, क्योंकि गैर-दृश्यमान चरित्र एन्कोड किया जाता है। यह केवल 1 char है, और अब तक कामकाज इसे बंद करना है। – Michel

0

इसके अलावा XmlNamespaceDeclarationsAttribute की जाँच करें। चेतावनी: जब इसे deserializing आपको केवल उस तत्व द्वारा परिभाषित नामस्थान प्रदान करेगा, तो इसमें मूल तत्वों में परिभाषित नामस्थान नहीं होंगे। यदि आपके पास लगातार रूट प्रकार नहीं है तो @John सॉंडर्स से XmlSerializer.Serialize() अधिभार का उपयोग करें।

http://msdn.microsoft.com/en-us/library/system.xml.serialization.xmlnamespacedeclarationsattribute.aspx

एक और सवाल @ जॉन सॉन्डर्स में डबल्यूएसडीएल में नियंत्रित xmlns के संबंध में इस विशेषता का उपयोग करने का सुझाव: Namespace Prefixes in Wsdl (.net)

MSDN नमूना से:

// C# 
using System; 
using System.IO; 
using System.Xml.Serialization; 
[XmlRoot("select")] 
public class Select { 
    [XmlAttribute] public string xpath; 
    [XmlNamespaceDeclarations] public XmlSerializerNamespaces xmlns; 
} 
public class Test { 
    public static void Main(string[] args) { 
     Select mySelect = new Select(); 
     mySelect.xpath = "myNS:ref/@common:y"; 
     mySelect.xmlns = new XmlSerializerNamespaces(); 
     mySelect.xmlns.Add("MyNS", "myNS.tempuri.org"); 
     mySelect.xmlns.Add("common", "common.tempuri.org"); 
     XmlSerializer ser = new XmlSerializer(typeof(Select)); 
     ser.Serialize(Console.Out, mySelect); 
    } 
} 
// Output: 
// <?xml version="1.0" encoding="IBM437"?> 
// <select xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmln:xsi="http://www.w3.org/2001/XMLSchema-instance" 
// xmlns:common="common.tempuri.org" xmlns:MyNS="myNS.tempuri.org" xpath="myNS:ref/@common:y" /> 
संबंधित मुद्दे