2012-02-17 24 views
14

Estoy intentando sacar un archivo XML sin cabeza XML como Traté:¿Cómo puedo omitir la declaración xml al serializar?

Type t = obj.GetType(); 
XmlSerializer xs=new XmlSerializer(t); 
XmlWriter xw = XmlWriter.Create(@"company.xml", 
             new XmlWriterSettings() { OmitXmlDeclaration = true, Indent = true }); 
xs.Serialize(xw,obj); 
xw.Close(); 

pero sigue outputing en el archivo XML. No quiero trucos de cuerda. ¿Algunas ideas?

+1

¿Por qué quiere hacer algo como esto, solo tengo curiosidad :)? –

+0

encontró algo similar en eso, eche un vistazo a: http://stackoverflow.com/questions/933664/net-xml-serialization-without-xml-root-node. –

+1

¿Tal vez la salida de algunos fragmentos, que luego se agregan a un documento? ¿O tal vez enviar fragmentos XML a través de tomas como XMPP? Mucho uso para eso :) – dowhilefor

Respuesta

20

Establecer la ConformanceLevel a Fragment, así:

Type t = obj.GetType(); 
XmlSerializer xs=new XmlSerializer(t); 
XmlWriter xw = XmlWriter.Create(@"company.xml", 
           new XmlWriterSettings() { 
            OmitXmlDeclaration = true 
            , ConformanceLevel = ConformanceLevel.Auto 
            , Indent = true }); 
xs.Serialize(xw,obj); 
xw.Close(); 
+9

Gracias, pero tengo este error: System.InvalidOperationException: WriteStartDocument no se puede invocar en escritores creados con ConformanceLevel.Fragment. – orange

+8

@orange Tuve la misma excepción lanzada, pero establecer 'OmitXmlDeclaration = true' y establecer explícitamente' ConformanceLevel = ConformanceLevel.Auto' me dio el resultado esperado. – Grx70

+0

@ Grx70 Tuve el mismo problema, y ​​tu solución funcionó para mí también, gracias. –

4

Eche un vistazo en el documentation. Hay que ver

The XML declaration is always written if ConformanceLevel is set to Document, even if OmitXmlDeclaration is set to true.

The XML declaration is never written if ConformanceLevel is set to Fragment. You can call WriteProcessingInstruction to explicitly write out an XML declaration.

Así que hay que añadir

ConformanceLevel = ConformanceLevel.Fragment; 
+0

Lo he intentado con 'ConformanceLevel = ConformanceLevel.Fragment' pero la serialización falla. Sin embargo 'ConformanceLevel = ConformanceLevel.Auto' funciona como un amuleto (como está escrito en la respuesta de Diego) – oleksa

1

Si utiliza la sobrecarga Serialize (Stream, objetos, XmlSerializerNamespaces) y proporciona null como XmlSerializerNamespaces, el XmlSerializer no intentará escribir WriteStartDocument. Pruebe:

xs.Serialize(xw, obj, null); 
+1

Esto también funciona. Si está serializando de forma personalizada parte de una cadena de objetos implementando la interfaz IXmlSerializable, ya tiene un XmlWriter, por lo que esta solución se simplifica. – NthDeveloper

Cuestiones relacionadas