13

में "d1p1" नामस्थान उपसर्ग निकालें, मैं अपने डोमेन मॉडल को xml फ़ाइल में क्रमबद्ध करने के लिए DatacontractSerializer का उपयोग कर रहा हूं। मुझे नीचे की तरह आउटपुट मिल रहा है।DataContractSerializer XML आउटपुट

<z:anyType xmlns:i="http://www.w3.org/2001/XMLSchema-instance" z:Id="1" xmlns:d1p1="DCSerialization_IGITApproach" i:type="d1p1:X" xmlns:z="http://schemas.microsoft.com/2003/10/Serialization/"> 
    <d1p1:Name z:Id="2">Ankit</d1p1:Name> 
    <d1p1:PointsDictionary xmlns:d2p1="http://schemas.microsoft.com/2003/10/Serialization/Arrays" z:Id="3" z:Size="1"> 
    <d2p1:KeyValueOfstringPointsArrayq9VX7VJJ> 
     <d2p1:Key z:Id="4">key1</d2p1:Key> 
     <d2p1:Value xmlns:d4p1="http://schemas.datacontract.org/2004/07/SerializationApproach" z:Id="5"> 
     <d4p1:points z:Id="6" z:Size="2"> 
      <d2p1:double>45.5</d2p1:double> 
      <d2p1:double>546.45</d2p1:double> 
     </d4p1:points> 
     </d2p1:Value> 
    </d2p1:KeyValueOfstringPointsArrayq9VX7VJJ> 
    </d1p1:PointsDictionary> 
</z:anyType> 

और मैं इन "d1p1" नामस्थान उपसर्ग से छुटकारा पाने के लिए चाहते हैं और सिर्फ </PointDictionary> बजाय टैग </d1p1:PointsDictionary> की तरह चाहते हैं। मैंने अपनी कक्षा गुणों पर डेटामेम्बर विशेषता डालने का प्रयास किया है लेकिन यह समस्या का समाधान नहीं करता है। आउटपुट एक्सएमएल फ़ाइल को अंतिम उपयोगकर्ता द्वारा संपादित किया जा सकता है, इसलिए मैं उपरोक्त की तुलना में एक क्लीनर को एक्सएमएल फ़ाइल देखना चाहता हूं।

प्राथमिकता केवल कोड के माध्यम से इसे नियंत्रित करना है और यदि संभव नहीं है तो XSLT या किसी अन्य स्कीमा के लिए जाएं।

+0

स्टैक ओवरव्लो में आपका स्वागत है: यदि आप कोड, एक्सएमएल या डेटा नमूने पोस्ट करते हैं, ** कृपया ** टेक्स्ट एडिटर में उन पंक्तियों को हाइलाइट करें और संपादक टूलबार पर "कोड नमूने" बटन ('{}') पर क्लिक करें प्रारूप और वाक्यविन्यास इसे हाइलाइट करें! –

उत्तर

3

ऐसा लगता है कि DataContractSerializer उपसर्गों पर अधिक नियंत्रण नहीं देता है। XML Serialization and namespace prefixes का उत्तर XmlSerializer का उपयोग करने का सुझाव देता है यदि आप नामस्थान उपसर्ग को नियंत्रित करना चाहते हैं।

आपका प्रश्न यह स्पष्ट नहीं था कि आप अपने डोमेन मॉडल के लिए नामस्थान उपसर्ग को पूरी तरह से हटाना चाहते हैं या नहीं। आपके नमूने में कई नामस्थान उपसर्ग हैं: d1p1, d2p1, d4p1। Changing namespace for XML file in XSL Translation एक्सएसएलटी का उपयोग कर उपसर्ग नामकरण पर कुछ मार्गदर्शन प्रदान करता है।

+5

XmlSerializer DataContractSerializer की तुलना में दो सीमाओं से पीड़ित है: यह इंटरफेस को संभाल नहीं पाएगा, और यह प्रत्येक वर्ग को पैरामीटर रहित कन्स्ट्रक्टर रखने के लिए मजबूर करता है। मेरा मानना ​​है कि यह DataContractSerializer का उपयोग करने के लिए एक बेहतर दीर्घकालिक समाधान है और नामस्थान समस्या से निपटने के कुछ अन्य तरीकों को ढूंढता है। – Contango

+0

@ कॉन्टैंगो, मैं सिद्धांत रूप से सहमत हूं ... सिवाय इसके कि 'डेटाकंट्रैक्टसाइलाइज़र' * करता है * (मेरे अनुभव में) को पैरामीटर रहित कन्स्ट्रक्टर की आवश्यकता होती है। मुझे रनटाइम त्रुटि मिलती है यदि मैं इसे उस प्रकार पर तुरंत चालू करने का प्रयास करता हूं जिसमें कोई नहीं है। – harpo

+0

@harpo DataContractSerializer निश्चित रूप से खाली कन्स्ट्रक्टर की आवश्यकता नहीं है। आप कुछ गलत कर रहे हैं। यदि आप अपने कोड को एक नए प्रश्न में पोस्ट करना चाहते हैं तो मुझे इसकी समीक्षा करने में खुशी होगी। – Dan

5

खाली नामस्थान का उपयोग करना उपसर्ग को निकालने लगता है। सेटअप निम्नलिखित DataContract विशेषता के साथ अपने वर्ग:

[DataContract(Namespace="")] 
public class MyClass 
{ ... } 

फिर एक खाली स्ट्रिंग जब (डी) के लिए नाम स्थान सेट करना सुनिश्चित करें serializing:

DataContractSerializer deserializer = new DataContractSerializer(typeof(MyClass), typeof(MyClass).Name, ""); 
0

आप में सक्षम होना चाहिए उन उपसर्गों से छुटकारा पाने के यह सुनिश्चित करके कि आप जो कक्षाएं एक्सएमएल को क्रमबद्ध करने की कोशिश कर रहे हैं वे समान नामस्थान में हैं। उदाहरण के लिए मेरे पास दो वर्ग अनुप्रयोग लिस्ट रिस्पॉन्स और एप्लिकेशन थे। पहले नामस्थान मॉडल थे। रेस्पॉन्स और मॉडल। रेस्पॉन्स। आवेदन। मैंने दोनों नामस्थानों को "मॉडल" के रूप में बदल दिया और एक्सएमएल आउटपुट में उपसर्ग से छुटकारा पा लिया।

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