2010-02-26 14 views
49

मैं के साथ सी # एक तरह से जो मैं एक्सएमएल में एक वर्ग को क्रमानुसार और एक नाम स्थान जोड़ने के लिए, लेकिन उपसर्ग जो कि नाम स्थान का उपयोग करेगा परिभाषित कर सकते हैं के लिए देख रहा हूँ।एक्सएमएल क्रमबद्धता और नामस्थान उपसर्ग

अंत में मैं निम्न XML उत्पन्न करने के लिए कोशिश कर रहा हूँ:

<myNamespace:Node xmlns:myNamespace="..."> 
    <childNode>something in here</childNode> 
</myNamespace:Node> 

मैं के साथ पता दोनों DataContractSerializer और XmlSerializer मैं एक नाम स्थान में जोड़ सकते हैं, लेकिन वे आंतरिक रूप से एक उपसर्ग उत्पन्न करने के लिए लगता है, कुछ के साथ है कि मैं मैं नियंत्रण में सक्षम नहीं हूँ। क्या मैं इन धारावाहिकों में से किसी एक के साथ इसे नियंत्रित करने में सक्षम हूं (मैं उनमें से किसी एक का उपयोग कर सकता हूं)?

अगर मैं नामस्थान मैं अपने खुद के एक्सएमएल serializer लिखने के लिए की आवश्यकता होगी की पीढ़ी नियंत्रित करने में सक्षम नहीं कर रहा हूँ, और यदि हां, सबसे अच्छा एक इसके लिए लिखने के लिए क्या है?

उत्तर

84

नामस्थान उपनाम को नियंत्रित करने के लिए, XmlSerializerNamespaces का उपयोग करें।

[XmlRoot("Node", Namespace="http://flibble")] 
public class MyType { 
    [XmlElement("childNode")] 
    public string Value { get; set; } 
} 

static class Program 
{ 
    static void Main() 
    { 
     XmlSerializerNamespaces ns = new XmlSerializerNamespaces(); 
     ns.Add("myNamespace", "http://flibble"); 
     XmlSerializer xser = new XmlSerializer(typeof(MyType)); 
     xser.Serialize(Console.Out, new MyType(), ns); 
    } 
} 

आप रनटाइम पर नाम स्थान बदलने की जरूरत है, तो आप अतिरिक्त XmlAttributeOverrides उपयोग कर सकते हैं।

+4

+1 लेकिन क्या मैं यह स्पष्ट करने के लिए एक संपादन का सुझाव दे सकता हूं कि इसमें पहला पैरामीटर है। एड विधि वह जगह है जहां उपसर्ग को सेट करने के लिए जादू होता है। जब तक मैंने एमएसडीएन दस्तावेज़ों की जांच नहीं की तब तक मुझे उत्तर से यह स्पष्ट नहीं था। –

+0

मेला यह मानने के लिए कि DataContractSerializer के बराबर नहीं है? (बस मेरे विकल्पों को खोलना चाहते हैं) –

+0

@ स्लेस - हाँ, मेरा मानना ​​है कि यह मानना ​​सुरक्षित है कि ** ** डीसीएस के लिए समकक्ष नहीं है **। आखिरकार, डीसीएस आपको आउटपुट पर अधिक नियंत्रण देने का इरादा नहीं रखता है (यदि आप एक्सएमएल को नियंत्रित करना चाहते हैं, तो 'एक्सएमएलएसरियललाइज़र' का उपयोग करें - यह उसका काम है)। –

3

एक स्कीमा से जेनरेट कोड का उपयोग करते समय जहां नामों का नाम है, इस नेमस्पेस ओवरराइड रूट स्तर पर लागू होता है लेकिन अलग-अलग प्रकार के टैग में कक्षा के साथ नामस्थान होगा।

मैं एक अवसर दो अलग उत्पन्न वर्गों उपयोग करने की आवश्यकता है, लेकिन जो सर्वर मैं करने के लिए (मेरे नियंत्रण में नहीं मत पूछो) बात कर रहा था के आधार पर अलग-अलग नाम रिक्त स्थान के लिए किया था।

मैं सब यहाँ की पेशकश की ओवरराइड करने की कोशिश की और अंत में छोड़ दिया और जानवर बल विधि का एक प्रकार है कि वास्तव में बहुत अच्छी तरह से काम किया करते थे। मैंने जो किया वह एक स्ट्रिंग को क्रमबद्ध किया गया था। फिर नेमस्पेस को बदलने के लिए स्ट्रिंग.रेप्लेस का उपयोग करें और स्ट्रिंगराइटर का उपयोग करके स्ट्रिंग से स्ट्रीम को पोस्ट करें। प्रतिक्रिया पर वही - एक स्ट्रिंग पर कैप्चर करें - नेमस्पेस में हेरफेर करें और स्ट्रिंग लेखक से स्ट्रिंग को deserialize करें।

यह सुरुचिपूर्ण या सभी फैंसी ओवरराइड का उपयोग नहीं कर सकता है लेकिन यह काम पूरा हो गया है।

संबंधित मुद्दे