2009-06-29 10 views
15

Intento usar la API de domainpeople.com y para hacerlo necesito usar XML.Xdocument no imprime la declaración

Actualmente tengo un error que dice "apiProtocol no se encuentra" Supongo que mi documento Xml está mal formado.

El XML actual es enviado:

<apiProtocol version="1" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNameSpaceSchemaLocation="checkrequest.xsd"> 
    <checkRequest user="ifuzion" password="fish4gold121" reference="123456789"> 
    <domain name="google.com" /> 
    </checkRequest> 
</apiProtocol> 

Al parecer la parte <?xml?> no imprime.

Mi código es básicamente algo similar a:

XDocument xDocument = new XDocument(
new XDeclaration("1.0", "UTF-8", "yes"), 
new XElement("Books")); 

(Me desnudé mi código por una cuestión de simplicidad, pero la estructura es exactamente similar).

¿Hay alguna razón por la cual XDocument no imprime la parte <?xml?>? Parece que con XmlDocument funciona, pero no con XDocument ... ¿alguna pista?

Respuesta

16

¿Cómo está imprimiendo el contenido de su XDocument?

El método .ToString() no incluye el encabezado xml, pero el método .Save() sí lo hace.

Editar: La misma respuesta se le dio here.

+0

Sí acaba de ver que necesitaba un StringWriter .... Aparte de eso, parece que puedo poner cualquier cosa en el tipo de codificación para la declaración que todavía usará UTF-16 ... actualmente buscando arreglar ese – Erick

+3

. ¿encuentra una solución para el problema UTF-16? Yo experimento lo mismo. Supongo que es porque las cadenas en .NET son UTF-16, y si no estás codificando para una secuencia de bytes, ¿siempre será UTF-16? – User

+0

Parece que la respuesta de Mörk ofrece una solución potencial (http://stackoverflow.com/questions/1060164/xdocument-does-not-print-declaration/1060282#1060282), pero debe traducir manualmente entre una 'XDeclaration.Encoding 'cadena y una salida real' Formato de codificación '. – patridge

10

¿cómo se guarda ella? Si hago lo siguiente, la declaración XML sale como debería:

XDocument xDocument = new XDocument(
    new XDeclaration("1.0", "UTF-8", "yes"), 
    new XElement("Books")); 
xDocument.Save(@"c:\temp\file.xml"); 

La salida tiene el siguiente aspecto:

<?xml version="1.0" encoding="utf-8" standalone="yes"?> 
<Books /> 

Sin embargo, si en lugar de pasar una instancia XmlWriter, parece como si el ajustes para que XmlWriter anula lo que se indica en el XDocument:

XDocument xDocument = new XDocument(
    new XDeclaration("1.0", "UTF-8", "yes"), 
    new XElement("Books")); 
StringBuilder sb = new StringBuilder(); 
using (XmlWriter writer = XmlWriter.Create(sb)) 
{ 
    xDocument.Save(writer); 
} 
Console.WriteLine(sb.ToString()); 

la salida tiene el siguiente aspecto:

<?xml version="1.0" encoding="utf-16" standalone="yes"?><Books /> 

Observe cómo la codificación cambió a "utf-16" y la sangría ha cambiado. Si agrega una instancia de XmlWriterSettings que indique la codificación (y cualquier otra configuración que desee controlar), obtendrá un mejor resultado.El siguiente código hace lo que espera:

XDocument xDocument = new XDocument(
    new XDeclaration("1.0", "UTF-8", "yes"), 
    new XElement("Books")); 
XmlWriterSettings settings = new XmlWriterSettings(); 
settings.Encoding = Encoding.UTF8; 
settings.ConformanceLevel = ConformanceLevel.Document; 
settings.Indent = true; 

using (XmlWriter writer = XmlWriter.Create(@"c:\temp\xdocument.xml", settings)) 
{ 
    xDocument.Save(writer); 
} 

Salida:

<?xml version="1.0" encoding="utf-8" standalone="yes"?> 
<Books /> 
1

Solución para la serialización de cadena:

// Default encode as Utf8 
Encoding outputEncoding = new UTF8Encoding(/*bom*/false); 

// Try to use Xml encoding 
if (xml.Declaration != null && 
    xml.Declaration.Encoding.ToNonNull().ToLower() != System.Text.Encoding.UTF8.WebName) 
{ 
    outputEncoding = System.Text.Encoding.GetEncoding(xml.Declaration.Encoding); 
} 

using (var stream = new MemoryStream()) 
{ 
    using (new XmlTextWriter(stream, outputEncoding)) 
    { 
     xml.Save(stream); 
    } 

    return outputEncoding.GetString(stream.ToArray()); 
} 
+0

por favor explique. – johannes