2009-06-05 15 views
49

¿Hay alguna manera de hacer que un XDocument imprima la versión xml cuando se utiliza el método ToString? Tiene algo salida como esta:Cómo imprimir <? Xml version = "1.0"?> Usando XDocument

<?xml version="1.0"?> 
<!DOCTYPE ELMResponse [ 
]> 
<Response> 
<Error> ...

Tengo el siguiente:

var xdoc = new XDocument(new XDocumentType("Response", null, null, "\n"), ...

que imprimirá este que está muy bien, pero le falta la "< xml version?", Como se ha señalado anteriormente.

<!DOCTYPE ELMResponse [ 
]> 
<Response> 
<Error> ...

Sé que puede hacer esto entregándolo manualmente a mi auto. Solo quería saber si era posible usando XDocument.

+1

lateral: el hecho de que XDocument.ToString() omite el XDeclaration también significa que no verá la declaración en la ventana del reloj del depurador VS, aunque la XDeclaration está en el XDocument. – dthorpe

Respuesta

94

Mediante el uso de XDeclaration. Esto agregará la declaración.

Pero con ToString no obtendrá la salida deseada.

Necesita usar XDocument.Save() con uno de sus métodos.

muestra completa:

var doc = new XDocument(
      new XDeclaration("1.0", "utf-16", "yes"), 
      new XElement("blah", "blih")); 

    var wr = new StringWriter(); 
    doc.Save(wr); 
    Console.Write(wr.ToString()); 
+2

Sí, tienes razón, me perdí la parte cuando dijo que estaba usando ToString(). Por lo tanto, use XDeclaration AND Save() (para archivo o un flujo de memoria). –

+1

o una cadena a través de stringwriter ;-) – EricSch

+0

Comentario similar al anterior, ya que la pregunta indicaba una DTD, la versión independiente debe ser "no". –

2

sólo tiene que escribir este

var doc = 
    new XDocument (
     new XDeclaration ("1.0", "utf-16", "no"), 
     new XElement ("blah", "blih") 
    ); 

y se obtiene

<?xml version="1.0" encoding="utf-16" standalone="no"?> 
<blah>blih</blah> 
+7

No completamente correcto, ToString no funcionará. – EricSch

+0

El rublo es Yo uso LinqPad para probar y me perdí el Guardar ... –

+1

Además, como la pregunta indica el uso de una DTD, independiente debe ser "No". –

9

Esto es, con mucho, la mejor manera y más manejable:

var xdoc = new XDocument(new XElement("Root", new XElement("Child", "台北 Táiběi."))); 

string mystring; 

using(var sw = new MemoryStream()) 
{ 
    using(var strw = new StreamWriter(sw, System.Text.UTF8Encoding.UTF8)) 
    { 
     xdoc.Save(strw); 
     mystring = System.Text.UTF8Encoding.UTF8.GetString(sw.ToArray()); 
    } 
} 

y digo que sólo porque se puede cambiar la codificación a nada cambiando a .utf8. Unicode o .UTF32

0

código de la solución VB.NET

Código

Dim _root As XElement = <root></root> 
    Dim _element1 As XElement = <element1>i am element one</element1> 
    Dim _element2 As XElement = <element2>i am element one</element2> 
    _root.Add(_element1) 
    _root.Add(_element2) 
    Dim _document As New XDocument(New XDeclaration("1.0", "UTF-8", "yes"), _root) 
    _document.Save("c:\xmlfolder\root.xml") 

salida Nota (por favor, abra la salida en el bloc de notas) nota

<?xml version="1.0" encoding="utf-8" standalone="yes"?> 
<root> 
    <element1>i am element one</element1> 
    <element2>i am element one</element2> 
</root> 
Cuestiones relacionadas