2011-11-02 24 views
5

Escribo un contenedor para una API XML de braindead enterprise. Tengo un XDocument que necesito convertir en una cadena. Debido al hecho de que su analizador XML es tan meticuloso que ni siquiera puede manejar espacios en blanco entre los nodos XML, la declaración de documento debe ser exactamente:XDocument to string: ¿Cómo omitir la codificación en la declaración?

<?xml version="1.0"?> 

Sin embargo, el método de XDocument.Save() siempre añade una codificación atribuir en esa declaración:

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

con la última hora gastado en Google y Stack buscando la mejor manera de generar la cadena XML, lo mejor que puedo hacer es:

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

he tratado

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

y que tiene éxito en el establecimiento de la declaración en el XDocument la forma que yo quiero; sin embargo, cuando llamo al método Save(), el atributo de codificación se devuelve mágicamente allí, sin importar la ruta a la que vaya (usando TextWriter, agregando XmlWriterSettings, etc.).

¿Alguien tiene una mejor manera de hacer esto, o mi código está condenado a tener un párrafo de despotricar en los comentarios sobre la horrible cadena de reemplazo?

Respuesta

10

Bueno, el extremo receptor debe ser reparado para usar un analizador XML y no algo que rompe con la sintaxis XML pero con .NET si desea crear una cadena con la declaración XML como la publicó, el siguiente enfoque funciona para mí:

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

y luego

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); 

salidas

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