2011-11-02 14 views
5

Sto scrivendo un wrapper per un'API XML enterprise braindead. Ho un XDocument che ho bisogno di trasformare in una stringa. A causa del fatto che il loro parser XML è così schizzinoso che non può gestire anche gli spazi bianchi tra i nodi XML, la dichiarazione di documento deve essere esattamente:XDocument to string: Come omettere la codifica nella dichiarazione?

<?xml version="1.0"?> 

Tuttavia, il metodo di XDocument.Save() sempre aggiunge una codifica attribuire a tale dichiarazione:

<?xml version="1.0" encoding="utf-16"?> 

Con nell'ultima ora speso su Google e Stack cercando il modo migliore per generare la stringa XML, il meglio che posso fare è:

string result = xmlStringBuilder.ToString().Replace(@"encoding=""utf-16"", string.Empty)); 

ho provato

xdoc.Declaration = new XDeclaration("1.0", null, null); 

e che non riescono a stabilire la dichiarazione in XDocument il modo in cui lo voglio; tuttavia, quando chiamo il metodo Save(), l'attributo encoding viene magicamente riportato indietro, indipendentemente da quale percorso vada (usando TextWriter, aggiungendo XmlWriterSettings, ecc.).

Qualcuno ha un modo migliore per farlo, oppure il mio codice è destinato per sempre a contenere un paragrafo di ranting nei commenti sopra l'orribile stringa sostituita?

risposta

10

Bene, il terminale di ricezione deve essere corretto per utilizzare un parser XML e non qualcosa che rompe con la sintassi XML ma con .NET se si desidera creare una stringa con la dichiarazione XML mentre lo si è pubblicato, il seguente approccio funziona per me:

public class MyStringWriter : StringWriter 
{ 
    public override Encoding Encoding 
    { 
     get 
     { 
      return null; 
     } 
    } 
} 

e poi

XDocument doc = new XDocument(
     new XDeclaration("1.0", null, null), 
     new XElement("root", "test") 
     ); 

    string xml; 

    using (StringWriter msw = new MyStringWriter()) 
    { 
     doc.Save(msw); 
     xml = msw.ToString(); 
    } 

    Console.WriteLine(xml); 

uscite

<?xml version="1.0"?> 
<root>test</root>