2011-06-07 9 views
14

किसी कारण निम्न कोड एक्सएमएल पैदा करता है कि एक घोषणा शामिल नहीं है के लिए:मेरा एक्सडेक्लेरेशन कहां है?

 XDocument xDocument = new XDocument(new XDeclaration("1.0", "utf-8", "yes"), 
      new XElement("project", 
       new XAttribute("number", project.ProjectNumber), 
       new XElement("store", 
        new XAttribute("number", project.StoreNumber) 
       ), 

       // User Element 
       new XElement("user", 
        new XAttribute("owner-id", project.OwnerID ?? 0), 
        new XElement("email", new XCData(project.OwnerEmail ?? "")), 
        new XElement("project-name", new XCData(project.ProjectName ?? "")) 
       ), 

       // Nested Project Element 
       new XElement("nested-project", 
        new XAttribute("version", new Version(1, 0)), 
        new XElement("project", 
         new XAttribute("version", new Version(1, 0)), 
         xProjectItems = new XElement("project-items") 
        ), 
        new XElement("price-per-part", project.PricePerPart), 
        new XElement("sheet-quantity", project.SheetQuantity), 
        new XElement("edge-length", project.EdgeLength), 
        new XElement("price", project.Price), 
        new XElement("status", project.Status), 
        xMaterialItems = new XElement("alternative-material-items"), 
        xProductItems = new XElement("project-product-items") 
       ) 
      ) 
     ); 

     String strXML = xDocument.ToString(); 

यह पहले एक घोषणा का उत्पादन किया गया। क्या मुझसे साफ़ - साफ़ कुछ चीज़ चूक रही है?

धन्यवाद।

उत्तर

23

जब आप XDocument.Save methods में से किसी एक का उपयोग करते हैं तो XDeclaration उपलब्ध होगा। उदाहरण के लिए:

var sw = new StringWriter(); 
doc.Save(sw); 
string result = sw.GetStringBuilder().ToString(); 
Console.WriteLine(result); 

संपादित करें: ध्यान दें कि कुछ दृष्टिकोण UTF-16 के लिए UTF-8 पदनाम परिवर्तित कर देंगे

var doc = new XDocument (
      new XDeclaration ("1.0", "utf-8", "yes"), 
      new XElement ("test", "data") 
     ); 

string path = Path.Combine(Path.GetTempPath(), "temp.xml"); 
doc.Save(path); 
Console.WriteLine(File.ReadAllText(path)); 

वैकल्पिक रूप से आप इस दृष्टिकोण का उपयोग कर सकते हैं।

using (var mem = new MemoryStream()) 
using (var writer = new XmlTextWriter(mem, System.Text.Encoding.UTF8)) 
{ 
    writer.Formatting = Formatting.Indented; 
    doc.WriteTo(writer); 
    writer.Flush(); 
    mem.Flush(); 
    mem.Seek(0, SeekOrigin.Begin); 
    using (var reader = new StreamReader(mem)) 
    { 
     var xml = reader.ReadToEnd(); 
     Console.WriteLine(xml); 
    } 
} 
+0

+1 मुझे अपने उत्तर में एक स्ट्रिंगवाइटर का उपयोग करना चाहिए था। रवींद्र! =] – rsbarro

+1

वह लंगड़ा है। आपका समाधान नहीं है (जो बहुत अच्छा है - मुझे नहीं पता था कि आप इसे 'स्ट्रिंगवाइटर' के साथ कर सकते हैं)। इसकी लंगड़ा कि माइक्रोसॉफ्ट ऐसा करेगा। मैं इस एक्सएमएल को फाइल में नहीं सहेज रहा हूं, मैं इसे स्ट्रीम में भेज रहा हूं। 'एक्सडॉक्यूमेंट' और 'एक्सलेमेंट' के बीच क्या अंतर है। मेरा मतलब यह अच्छा है कि वे एक जैसे हैं, लेकिन कुछ भेद होना चाहिए। और यदि कोई स्ट्रिंग में घोषणा नहीं चाहता है तो आप बस ऐसा कर सकते हैं: 'xMyDocument.Root.ToString();' – Jordan

+0

@ जोर्डन मुझे लगता है कि तर्क यह है कि एक एक्सडॉक्यूमेंट एक संपूर्ण दस्तावेज़ का प्रतिनिधित्व करता है, और XElement एक टुकड़ा है एक्सएमएल का इसके बावजूद, वे बहुत समान हैं। –

3

documentation स्पष्ट रूप से यह नहीं है कि xDocument.ToString() इच्छा उत्पादन XML घोषणा, यह केवल का कहना है:: आप इसे utf-8 होने के लिए मजबूर करने के लिए चाहते हैं, तो आप इस अलग दृष्टिकोण का उपयोग करना होगा "दांतेदार एक्सएमएल रिटर्न इस नोड के लिए। "

मेरे परीक्षण में, मैंने पाया कि निम्न विधियों उत्पादन घोषणा करेंगे:

उपयोग ToStringDeclaration संपत्ति पर:

string strXML = string.Concat(xDocument.Declaration.ToString(), "\r\n", 
           xDocument.ToString()); 

या का उपयोग Save विधि:

string strXml; 
using(var ms = new MemoryStream()) 
{ 
    xDocument.Save(ms); 
    ms.Position = 0; 
    using(var sr = new StreamReader(ms)) 
    { 
     strXml = sr.ReadToEnd(); 
    } 
} 
+0

नोट: मुझे लगता है कि @ अहमद मैगेड का दृष्टिकोण 'स्ट्रिंगवाइटर' के साथ जाने का तरीका है। वही विचार लेकिन मेरी 'सहेजें' विधि से छोटा है। प्रयास के लिए – rsbarro

+0

+1। मुझे लगता है कि एन्कोडिंग को मजबूर करने की आवश्यकता होने पर, मेरे संपादन में दिखाए गए लंबे दृष्टिकोण के लिए एक मामला है। –

2

मेरा उत्तर (the answer by @rsbarro से प्रेरित):

string xml = xDocument.Declaration.ToString() + 
    xDocument.ToString(); 

- या -

string xml = xDocument.Declaration.ToString() + 
    xDocument.ToString(SaveOptions.DisableFormatting); 

क्यों मेरा मानना ​​है कि + ऑपरेटर के उपयोग इस स्थिति में उचित है, इसलिए विचाराधीन What's the best string concatenation method using C#? को this answer देखते हैं।