Web Toolbar by Wibiya Crear el Xml con XmlTextWriter - Fran Diaz

Fran Diaz

Reporting Services, .NET, tecnologías Microsoft y otros

Email Notifications

Recent Posts

Tags

News

Community

Comunidades

  • OnobaNET
  • Grupo de usua
  • INETA
  • Culminis
  • Zona de Grupos de Usuarios Online
  • Foro MSDN Español: Colaborador

Webs Amigas

Archives

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
Posted: 7/9/2007 13:06 por Fran Díaz | con 10 comment(s)
Comparte este post:

Comentarios

nekoman ha opinado:

No es posible en vez de usar el WriteProcessingInstruction para el xml version="1.0" usar mejor el método WriteStartDocument( true ).

Facilita la vida un poquillo.

# September 7, 2007 3:08 PM

Fran Díaz ha opinado:

Pues si, diferentes formas de hacerlo nunca sobran Wink

Un Saludo

# September 7, 2007 4:40 PM

vichu ha opinado:

hola Fran, tengo un problema con reporting services 2005 y te agradecería si pudieras echarme una mano, te comento, tengo enlazado un reporting services 2005 con un odbc(informix), la query es bien simple y con un parametro opcional, algo como "Select * from clientes where IdCli = ?" el tema es que quiero que si no se introcuce parametro que aparezcan todos los clientes, algo como "select * from clientes where IdCli = ? or 1=1", pero nada que no hay manera de que funcione, siempre obtengo todos los clientes introduzca o no datos, el parametro está configurado como allow Blank, probé también de la misma manera pero con nulls y nada. Te agradecería si pudieras orientarme acerca de la solucion.

Muchas Gracias

J

# September 14, 2007 9:06 AM

Fran Díaz ha opinado:

Hola Vichu,

Yo crearía un parámetro en el informe y lo añadiría al query de la siguiente forma:

Parametro: MiParametro

Query:

="select * from clientes " & Parameters!MiParametro.Value

Aquí metería el "where IdCli = algo", si está vació le paso una cadena vacía.

Esto lo haría si controlas los parámetros desde código.

Sino algo así:

="select * from clientes" & IIF(Parameters!MiParametro.Value <> "", "where IdCli =" &  Parameters!MiParametro.Value,"")

Con esto debe de funcionarte.

Un Saludo

# September 14, 2007 9:30 AM

Julia Martín ha opinado:

Me ha surgido una duda y esperaba que alguien pudiera ayudarme.

Quiero pasar crear este xml con XmlTextWriter, pero no consigo realizarlo. ¿Alguien sabe como debo hacerlo?

<Marca id="Tipo">xxxxxx</Marca >

# September 27, 2007 5:17 PM

Fran Díaz ha opinado:

Hola Julia,

Para crear esa etiqueta tan solo tienes que poner estas línea:

oXML.WriteStartElement("Marca");

oXML.WriteAttributeString("Id", "Tipo");

oXML.WriteString("xxxxxx");

oXML.WriteEndElement();

Un Saludo

# October 2, 2007 4:58 PM

Luis Fernando ha opinado:

Hola Amigos estoy realizando reportes dinamicos  con Reporting Services.

Para ser mas explicito se crea el reporte segun los campos que el usuario defina(los campos ya estan predefinidos).

Hasta al momento  lo estoy logrando actualizando el archivo que tiene la definicion del reporte (xxx.rdl)   que es  un XML.

Ahora existe otra forma de Poder hacer esto?

# October 25, 2007 8:33 PM

Fran Díaz ha opinado:

Hola,

Si lo quieres dinámicamente eso es lo que hay, o alguna herramienta de terceros, que por ahora desconzco.

Yo ahora mismo estoy en eso mismo, a partir de tablas y relaciones voy sacando el xml. La verdad es que hay que poner alguna que otra etiqueta, pero cuando se termina queda guapo Big Smile.

Yo lo que hacía para probar que el xml está bien, es crearlo(una vez construida la clase que lo implementa) es mostrar el xml en un informe, dentro de un proyecto de servidor. Si salían los controles y en vista previa no daba ningún error es que funcionaba. Aparte de luego subirlo al servidor y demás. Es un truquillo para no tener que andar viendo por que no falla, además el editor de informes te dice en que línea falla.

En fin, toda una experiencia, jejeje.

Espero que te vaya bien,

Un Saludo

# October 26, 2007 7:43 PM

Mario de la Mora ha opinado:

En dado caso que yo quisiera crear el documento xml, y lo quisiera poner en la carpeta que tengo actualmente el archivo, que comodin utilizo para no poner toda la ruta del archivo.

De antemano se los agradezco

# December 8, 2007 2:33 AM

Fran Díaz ha opinado:

Hola Mario,

Con  Application.ExecutablePath obtienes la ruta de donde se ejecuta tu aplicación. Sino puedes moverte con lo clásico también: el punto(.) y los dos puntos(..).

Ejemplo:

string mipath = "..\miXml.xml"; (C#)

Dim mipath As String = ".\miXml.xml" (VB)

Un Saludo

# December 12, 2007 10:12 AM