Crear el Xml con XmlTextWriter
El objeto que escribe un archivo XML a parte de hacerlo nosotros a mano con un simple String, StringBuilder u otro modo es el XmlTextWriter. Este objeto escribe sobre un FileStream(un archivo físico) todo el etiquetado que nosotros le indiquemos. Para generar un informe personalizado en tiempo de ejecución(bueno, ese es el uso que yo le he dado). A través de una serie de propiedades que nosotros iremos utilizando tendremos listo nuestro informe.
En este post voy a obviar como está formado el XML de un informe y me voy a centrar en como componerlo. A partir de aquí y podremos crear la lógica de nuestro informe personalizado y sin tener que utilizar el diseñador.
No significa que no utilicemos el diseñador, sino que en algunos casos podría ser recomendable tener un editor personalizado que generara pequeños informes, ya sea para no estar generando informes sencillos cada dos por tres o para tener una aplicación que a través de varios clicks nuestro cliente tenga su informe listo.
Algunas características de las propiedades del XmlTextWriter son:
WriteProcessingInstruction.- Esta propiedad tiene dos parámetros el primero corresponde a el texto que irá al principio “<?[Primer Texto] [segundo texto]?>” y el segundo después de este seguido de un espacio. Con esto podemos conseguir lo siguiente: <?xml version="1.0" encoding="utf-8"?>, que será el encabezado de nuestro informe.
WriteStartElement.- Escribe una etiqueta de apertura y necesitará ser cerrada después
WriteAttributeString.- Esta propiedad nos creará en la anterior etiqueta una propiedad dentro con su valor. <Etiqueta NombrePropiedad=”ValorPropiedad”>. No necesita ser cerrado.
WriteElementString.- Escribe una etiqueta de apertura con un nombre y su valor. Esto generaría la siguiente etiqueta: <Nombre>Valor</Nombre>. No necesita ser cerrado como se puede comprobaren el ejemplo.
WriteEndElement.- Esta propiedad cierra una etiqueta creada con WriteStarElement
Pero veamos un ejemplo, para poder apreciar mejor estas propiedades.
// Creo el archivo donde almacenaré mi infomre.
FileStream oFile = new FileStream("UnaRuta\UnArchivo.rdl", FileMode.Create);
// Establezco el archivo y la codificación al objeto
XmlTextWriterXmlTextWriter oXML = new XmlTextWriter(oFile, Encoding.UTF8);
// Le indico que se cree con sangría los nodos del xml..
oXML.Formatting = Formatting.Indented;
oXML.WriteProcessingInstruction("xml", "version=\"1.0\" encoding=\"utf-8\"");
oXML.WriteStartElement("Report");
oXML.WriteAttributeString("xmlns",
"\http://schemas.microsoft.com/sqlserver/reporting/2005/01/reportdefinition\
xmlns:rd=\"http://schemas.microsoft.com/SQLServer/reporting/reportdesigner\"");
oXML.WriteStartElement("DataSources"); // Abro DataSources.
oXML.WriteStartElement("DataSource"); // Abro DataSource.
oXML.WriteAttributeString("Name", "NombreDS"); // Inserto propiedad dentro de etiqueta DataSource.
oXML.WriteStartElement("ConnectionProperties");
// Inserto etiquetas que no son necesario cerrar.
oXML.WriteElementString("IntegratedSecurity", "true");
oXML.WriteElementString("ConnectString", "=PARAMETERS!RPTCADENACONEX.Value");
oXML.WriteElementString("DataProvider", "SQL");
oXML.WriteEndElement(); // Cierro ConnectionProperties.
oXML.WriteEndElement(); // Cierro DataSource.
oXML.WriteEndElement(); // Cierro DataSources.
oXML.WriteEndElement(); // Cierro el report.
// Vuelco el buffer.
oXML.Flush();
oFile.Close();
Con este código anterior, creará el siguiente XML.
<?xml version="1.0" encoding="utf-8"?>
<Report xmlns=http://schemas.microsoft.com/sqlserver/reporting/2005/01/reportdefinition
xmlns:rd="http://schemas.microsoft.com/SQLServer/reporting/reportdesigner">
<DataSources>
<DataSource Name="NombreDS">
<ConnectionProperties>
<IntegratedSecurity>true</IntegratedSecurity>
<ConnectString>=PARAMETERS!RPTCADENACONEX.Value</ConnectString>
<DataProvider>SQL</DataProvider>
</ConnectionProperties>
</DataSource>
</DataSources>
</Report>
Ya solo queda pensar en todo el xml a generar para hacer nuestros propios informes o utilizarlo de otra forma.
Un Saludo