2008-09-25 11 views
98

.NET में XmlDocument से एक्सएमएल उत्पन्न करते समय, एक खाली xmlns विशेषता पहली बार एक तत्व के बिना एक संबंधित नेमस्पेस डाला जाता है; इसे कैसे रोका जा सकता है?.NET के XmlDocument से आउटपुट में रिक्त xmlns विशेषताओं को कैसे रोकें?

उदाहरण:

XmlDocument xml = new XmlDocument(); 
xml.AppendChild(xml.CreateElement("root", 
    "whatever:name-space-1.0")); 
xml.DocumentElement.AppendChild(xml.CreateElement("loner")); 
Console.WriteLine(xml.OuterXml); 

आउटपुट:

<root xmlns="whatever:name-space-1.0"><loner xmlns="" /></root> 

वांछित आउटपुट:

<root xmlns="whatever:name-space-1.0"><loner /></root> 

वहाँ एक समाधान XmlDocument कोड, नहीं कुछ है कि के बाद होता है के लिए लागू है दस्तावेज़ को OuterXml के साथ एक स्ट्रिंग में कनवर्ट करना?

ऐसा करने का मेरा तर्क यह देखने के लिए है कि क्या मैं XmlDocument- जेनरेट एक्सएमएल का उपयोग कर किसी विशेष प्रोटोकॉल के मानक एक्सएमएल से मेल खा सकता हूं। खाली xmlns विशेषता एक पार्सर को तोड़ने या भ्रमित नहीं कर सकता है, लेकिन यह इस प्रोटोकॉल के किसी भी उपयोग में भी मौजूद नहीं है।

उत्तर

95

धन्यवाद, मैं पता लगा खाली xmlns विशेषताओं को निकालने का तरीका: जब किसी भी बच्चे को नोड बनाने रूट नोड के नाम स्थान में पारित आप नहीं चाहते पर एक उपसर्ग है। रूट पर उपसर्ग के बिना नामस्थान का उपयोग करना मतलब है कि आपको उनके लिए बाल तत्वों पर उसी नामस्थान का उपयोग करने की आवश्यकता है भी उपसर्ग नहीं है।

फिक्स्ड कोड:

XmlDocument xml = new XmlDocument(); 
xml.AppendChild(xml.CreateElement("root", "whatever:name-space-1.0")); 
xml.DocumentElement.AppendChild(xml.CreateElement("loner", "whatever:name-space-1.0")); 
Console.WriteLine(xml.OuterXml); 

अपने सभी सवालों के जवाब जो मुझे सही दिशा में नेतृत्व करने के लिए सभी को धन्यवाद!

+1

निश्चित रूप से। "जो भी: नाम-स्थान-1.0" नामस्थान में तत्व डालने का अर्थ है कि खाली xmlns विशेषता (जो इसे नामस्थान में रखती है) इसे क्रमबद्ध होने पर इसमें जोड़ा नहीं जाएगा। यदि आपको नेमस्पेस कैसे काम करते हैं, इस पर ताज़ा करने की आवश्यकता है, तो http://www.jclark.com/xml/xmlns.htm – JeniT

+1

देखें: तत्वों को इसकी आवश्यकता है (या शायद बेहतर 'दस्तावेज़। दस्तावेज़ Ilement.NamespaceURI') लेकिन डॉन 'CreateAttribute()' के लिए नामस्थान निर्दिष्ट नहीं करने के लिए आपको 'xmlns: psomething'' मिलेगा, भले ही यह वही यूरी हो। –

9

अपने नमूना एक्सएमएल में <loner> तत्व उस पर xmlns डिफ़ॉल्ट नाम स्थान घोषणा नहीं था, तो यह whatever:name-space-1.0 नाम स्थान में नहीं बल्कि कोई नाम स्थान में होने से होगा। यदि यह तुम क्या चाहते हो, तो आप उस नाम स्थान में तत्व बनाने की जरूरत:

xml.CreateElement("loner", "whatever:name-space-1.0") 

आप <loner> तत्व कोई नाम स्थान में होना चाहते हैं, तो एक्सएमएल कि उत्पादन किया गया है कि वास्तव में आप क्या जरूरत है, और आप shouldn xmlns विशेषता के बारे में चिंता न करें जो आपके लिए स्वचालित रूप से जोड़ा गया है।

+2

समस्या अनुपालन न करने वाले एक्सएमएल पारसर्स के साथ निहित है (आमतौर पर माइक्रोसॉफ्ट से) जो xmnls = "" से निपट नहीं सकते हैं)। –

+2

/। बुलाया। वे अपनी यादृच्छिक एमएस बैशिंग टिप्पणी वापस चाहते हैं। – Will

+0

@W। क्रेग व्यापारी - यह नहीं कह सकता कि मुझे एक समस्या के रूप में सामना करना पड़ा है। उदाहरण? – Kev

7

चूंकि रूट एक अपरिवर्तित नेमस्पेस में है, रूट का कोई भी बच्चा जो गैर-नामित होना चाहता है, आपके उदाहरण की तरह आउटपुट होना चाहिए। समाधान तो जैसे मूल तत्व उपसर्ग होगा:

<w:root xmlns:w="whatever:name-space-1.0"> 
    <loner/> 
</w:root> 

कोड:

XmlDocument doc = new XmlDocument(); 
XmlElement root = doc.CreateElement("w", "root", "whatever:name-space-1.0"); 
doc.AppendChild(root); 
root.AppendChild(doc.CreateElement("loner")); 
Console.WriteLine(doc.OuterXml); 
+0

धन्यवाद, लेकिन वास्तविक रूट में नेमस्पेस जोड़ना मेरे द्वारा एक्सएमएल को उस विशेष प्रोटोकॉल के संबंध में तोड़ देगा जो मैं काम कर रहा हूं। –

+0

आह! मुझे और अधिक एहसास हुआ कि आप क्या कह रहे थे और अपना जवाब लिखते समय इसे ध्यान में रखा। धन्यवाद जेरेमी –

0

संभव हो तो, एक क्रमबद्धता वर्ग बनाने तो कार्य करें:

XmlSerializerNamespaces ns = new XmlSerializerNamespaces(); 
ns.Add("", ""); 
XmlSerializer serializer = new XmlSerializer(yourType); 
serializer.Serialize(xmlTextWriter, someObject, ns); 

यह सुरक्षित है, और आप यदि आपको वास्तव में अधिक नियंत्रण की आवश्यकता है तो विशेषताओं के साथ नामस्थानों को नियंत्रित कर सकते हैं। जेरेमी ल्यू के जवाब और अधिक के आसपास खेल रहे एक सा करने के लिए

0

मैंने फैक्टरी पैटर्न का उपयोग कर समस्या हल कर ली है। मैंने XElement ऑब्जेक्ट्स के लिए एक कारखाना बनाया है। कारखाने के तत्काल के लिए पैरामीटर के रूप में मैंने एक एक्सनेस्पेस ऑब्जेक्ट निर्दिष्ट किया है। इसलिए, हर बार कारखाने द्वारा XElement बनाया जाता है, नामस्थान स्वचालित रूप से जोड़ा जाएगा।

internal class XElementFactory 
{ 
    private readonly XNamespace currentNs; 

    public XElementFactory(XNamespace ns) 
    { 
     this.currentNs = ns; 
    } 

    internal XElement CreateXElement(String name, params object[] content) 
    { 
     return new XElement(currentNs + name, content); 
    } 
} 
+0

ओपी 'एक्सएमएल दस्तावेज़' के बारे में पूछ रहा था, न कि 'एक्सडॉक्यूमेंट'। –

64

यह JeniT के जवाब का एक प्रकार है (यदि आप बहुत बहुत btw धन्यवाद!)

XmlElement new_element = doc.CreateElement("Foo", doc.DocumentElement.NamespaceURI); 

यह कॉपी या हर जगह नाम स्थान को दोहराने के लिए होने निकाल: यहाँ कारखाने के कोड है।

+3

मेरे अनुसार सबसे अच्छी प्रतिक्रिया। हमें यह नहीं पता कि दस्तावेज़ डिफ़ॉल्ट नामस्थान क्या है (उपयोगी जब हम स्क्रैच से xml फ़ाइल नहीं बनाते हैं यानी परिदृश्य पढ़ने और संशोधित करने में)। – MuiBienCarlota

-1

हां आप XMLml को XmlElement से रोक सकते हैं। पहले बनाना समय यह आ रहा है: कि

<trkpt lat="30.53597" lon="-97.753324" xmlns=""> 
    <ele>249.118774</ele> 
    <time>2006-05-05T14:34:44Z</time> 
</trkpt> 

बदलें की तरह कोड: और यह

सी # कोड की तरह एक्सएमएल नाम स्थान पारित:

XmlElement bookElement = xdoc.CreateElement("trkpt", "http://www.topografix.com/GPX/1/1"); 
bookElement.SetAttribute("lat", "30.53597"); 
bookElement.SetAttribute("lon", "97.753324");