2010-02-19 21 views
8

को मैं एक समारोह जो एक सूची वस्तु के लिए एक्सएमएल उत्पन्न करता है:XElement समारोह जोड़ें "xmlns =" ​​कहते हैं XElement

public XDocument ToXML() 
{ 
    foreach (var row in this) 
    { 
     var xml = row.ToXml(); 
     template.Root.Add(xml); 
    } 
    return template; 
} 

template.ToString() पढ़ता है: <RootElement xmlns="urn:testTools">

एक्सएमएल पढ़ता है: <Example><SubElement>testData</SubElement></Example>

के बाद ऐड समारोह template.ToString मार डाला गया है() पढ़ता है: <RootElement xmlns="urn:testTools"><Example xmlns=""><SubElement>testData</SubElement></Example>

तो किसी कारण से खाली नामस्थान जोड़ा गया था, मैं इसे ऐसा करने से कैसे रोक सकता हूं?

उत्तर

7

उदाहरण और उप-तत्व तत्वों पर नामस्थान को रूट एलीमेंट के समान सेट करें। यह इन तत्वों के लिए नामस्थान को साफ़ करने के लिए xmlns = "" जोड़ रहा है।

+0

ठीक है अब मैं समझता हूं कि ऐसा क्यों करता है, धन्यवाद! लेकिन यह केवल तभी उपयोगी होता है जब आप एक अलग एक्सएमएल दस्तावेज़ बनाते समय अलग-अलग नामस्थानों के साथ अलग-अलग एक्सएमएल मर्ज करते हैं। इसके अलावा एक खाली नामस्थान टैग मान्य xml नहीं है। – JJoos

+1

@JJoos: एक खाली नामस्थान निश्चित रूप से मान्य एक्सएमएल है। आपको क्या लगता है कि यह नहीं है? साथ ही, ध्यान रखें कि एक एकल XML दस्तावेज़ में कई नामस्थानों से तत्व और गुण हो सकते हैं। –

+0

@ जॉन सॉंडर्स आप सही हैं, सोचा था कि यह अवैध था: http://www.w3.org/TR/REC-xml-names/ अनुभाग 2.2 पहली पंक्ति। भ्रमित करने की तरह। धन्यवाद। – JJoos

0

यह हो सकता है, जो आपके मूल ठीक से बंद किए जाने की जरूरत:

<RootElement xmlns="urn:testTools"> to <RootElement xmlns="urn:testTools"/> 
0

मैं एक regex के साथ तत्वों की जगह इसे हल। फोल का समाधान काम नहीं करता था, क्योंकि कोड में उस बिंदु पर मैं हमेशा सटीक नामस्थान नहीं था।

template = XDocument.Parse(new Regex("<ElementName.*>") 
    .Replace(template.ToString(SaveOptions.DisableFormatting), "<ElementName>")); 
+4

अपने नियमित अभिव्यक्तियों से सावधान रहें। एक्सएमएल नियमित भाषा नहीं है, इसलिए सामान्य रूप से, एक्सएमएल के खिलाफ नियमित अभिव्यक्तियों का उपयोग नहीं किया जाना चाहिए। –

9

यहाँ एक उदाहरण है कि खाली नामस्थान बिना xml आउटपुट है:

तो यहाँ मेरी गंदा हैक कि काम करता है। विचित्र लिंक-केंद्रित सिंटैक्स रूट नामस्थान + "MyElementName" पर ध्यान दें, जो रहस्य है। यह संपूर्ण दस्तावेज़ के समान नामस्थान है, इस प्रकार कोई xmlns अतिरिक्त आवश्यक नहीं है। यह एक एक्सनेस्पेस + एक स्ट्रिंग को जोड़ रहा है, जो एक "+" अधिभार है जो लिंक के लिए काम करता है और यह कि लिंक जानता है कि कैसे निपटें। (लिंक के बिना यह स्ट्रिंग और गैर स्ट्रिंग प्रकार को संयोजित करने के लिए एक संकलित त्रुटि हो सकती है)। नोट यह एक सी # प्रोजेक्ट फ़ाइल के खिलाफ निष्पादित किया गया था जो एक आसान एक्सएमएल फ़ाइल है। इसे एक कंसोल या एक richtextbox नियंत्रण के लिए आउटपुट। फिर "rootNamespace +" निकालें और अंतर देखें।

 XDocument doc = null; 

     using (StreamReader streamReader = 
      new StreamReader(@"myXml.csproj")) 
     { 
      doc = XDocument.Load(streamReader, LoadOptions.None); 
     } 
     XNamespace rootNamespace = doc.Root.Name.NamespaceName; 

     // A search which finds the ItemGroup which has Reference 
     // elements and returns the ItemGroup XElement. 
     XElement element = doc.Descendants().Where(p => p.Name.LocalName == "ItemGroup" 
      && p.Descendants().First<XElement>().Name.LocalName == "Reference").First<XElement>(); 

     // Create a completly new element with sub elements. 
     XElement referenceElement = new XElement(rootNamespace + "Reference", 
      new XElement(rootNamespace + "SpecificVersion", bool.FalseString), 
      new XElement(rootNamespace + "HintPath", "THIS IS A HINT PATH")); 

     // Add the new element to the main doc, to the end of the Reference elements. 
     element.Add(referenceElement); 

     // Add an attribute after the fact for effect. 
     referenceElement.SetAttributeValue("Include", "THIS IS AN INCLUDE"); 

     rtb.Text = doc.ToString(SaveOptions.None); 
+0

धन्यवाद यह वास्तव में एक अच्छा समाधान की तरह दिखता है! अगली बार जब मैं इस समस्या में भाग जाऊंगा तो मैं इसे आजमाउंगा। – JJoos

+1

धन्यवाद! यह बहुत उपयोगी था! –

+1

धन्यवाद। यह बहुत अच्छा था! +1 –