Xml
Usando FOR XML EXPLICIT
by Rodrigo Olivares on Jul.23, 2009, under Bases de Datos, SqlServer, Xml
Lamentablemente en SQL Server 2000 no contamos con selecciones anidadas en las consultas para generar XML con una mejor semántica. Es por eso que es útil el uso de FOR XML EXPLICIT.
Baya Pavliashvili escribe un post que ayuda bastante con este tema.
Hay que tener en cuenta que esta forma de extraer XML es la que tiene más CONTRAS en comparación con las demás en cuanto a rendimiento y reutilización.
Deserializar/Serializar un listado de objetos con XmlArray, XmlArrayElement, XmlElement
by Rodrigo Olivares on Jun.18, 2009, under C#, VB.NET, Xml
Cuando usamos serialización es común encontrarse con estilos diferentes en la definición de esquemas para los archivos XML (sobre todo si tomamos servicios generados por otros equipos de trabajo). Por ejemplo, tenemos un XML que contiene información de libros, que contempla un autor con un listado de libros que él ha escrito. Entonces una forma de representar el XML puede ser:
<biblioteca> <autores> <autor nombre="" apellido=""> <libros> <libro nombre="" ISBN="" /> <libro nombre="" ISBN="" /> <libro nombre="" ISBN="" /> <libro nombre="" ISBN="" /> </libros> </autor> </autores> </biblioteca>
Entonces nuestras clases DatosAutor y DatosLibro podrían ser definidas de la siguiente forma:
<XmlRoot("autor")> _ Public Class DatosAutor Private _apellido As String <XmlAttribute("apellido")> _ Public Property Apellido() As String Get Return _apellido End Get Set(ByVal value As String) _apellido = value End Set End Property Private _nombre As String <XmlAttribute("nombre")> _ Public Property Nombre() As String Get Return _nombre End Get Set(ByVal value As String) _nombre = value End Set End Property Private _libros As List(Of DatosLibro) <XmlArray("libros"), XmlArrayItem("libro")> _ Public Property Libros() As List(Of DatosLibro) Get Return _libros End Get Set(ByVal value As List(Of DatosLibro)) _libros = value End Set End Property End Class Public Class DatosLibro Private _ISBN As String <XmlAttribute()> _ Public Property ISBN() As String Get Return _ISBN End Get Set(ByVal value As String) _ISBN = value End Set End Property Private _nombre As String <XmlAttribute("nombre")> _ Public Property Nombre() As String Get Return _nombre End Get Set(ByVal value As String) _nombre = value End Set End Property End Class
Ahora es probable que el XML pueda estar formateado de esta forma, o alguna mezcla con la anterior (noten la diferencia con la forma de agrupar los elementos “libro”):
<biblioteca> <autor nombre="" apellido=""> <libro nombre="" ISBN="" /> <libro nombre="" ISBN="" /> <libro nombre="" ISBN="" /> <libro nombre="" ISBN="" /> </autor> <autor nombre="" apellido=""> <libro nombre="" ISBN="" /> <libro nombre="" ISBN="" /> <libro nombre="" ISBN="" /> <libro nombre="" ISBN="" /> </autor> </biblioteca>
Para ello podremos usar la propiedad XmlElement indicando el nombre del elemento que se agregará al listado.
Private _libros As List(Of DatosLibro) <XmlElement("libro")> _ Public Property Libros() As List(Of DatosLibro) Get Return _libros End Get Set(ByVal value As List(Of DatosLibro)) _libros = value End Set End Property
Nota 1 : el ejemplo está aplicado solamente al nivel anidado de la clase DatosAutor, pero que perfectamente es aplicable al nivel más alto del listado de “Autores”.
Nota 2 : la propiedad XmlRoot() está definida para este caso para la clase DatosAutor, pero para la clase DatosLibro no se ha especificado. Esto es debido a que por defecto la deserialziación tomará el nodo especificado por XmlArrayItem (o XmlElement) y lo convertirá al tipo definido en el listado, no importando el nombre de la clase.
Nota 3 :Noten que para la propiedad ISBN del libro no tiene definido el nombre del atributo, esto significa que el atributo en el XML tiene el mismo nombre que el definido en la clase, en los otros cases debimos especificar el nombre debido a que en el Xml se usa lowercase.
Nota 4 :si no se especifica lo contrario la serialización asumirá que el atributo definido en la clase “calza” con un nodo dentro del XML definido con el mismo nombre. Si se especifica XmlAttribute(), se indicará que el atributo definido calza con un atributo xml con el mismo nombre que la propiedad.
Nota 5 : es posible redefinir los atributos, como por ejemplo XmlRoot para clases ya creadas, muy útil cuando queremos reutilizar una clase para la cual solamente cambia el XmlRoot definido.
Ejemplo de XML y XSL
by MigueliTUX on Jun.03, 2009, under Xml
tenemos el siguiente XML
<REGISTRO> <DATOS> <NOMBRE>JUAN</NOMBRE> <DIRECCION>MANUEL</DIRECCION> </DATOS> </REGISTRO>
y lo queremos mostrar en una tabla de un XSL
<table>
<tr>
<th width=”150″>Nombre</th>
<th width=”210″>Direccion</th>
</tr>
<xsl:for-each select=”/REGISTRO/DATOS”>
<tr>
<td><xsl:value-of select=”NOMBRE”/> </td>
<td><xsl:value-of select=”DIRECCION”/> </td>
</tr>
</xsl:for-each>
</table>
Setear atributos con XSL
by MigueliTUX on Jun.02, 2009, under Xml
<input type=”checkbox”> <xsl:attribute name=”name”> CHNOM<xsl:value-of select=”NODO”/> </xsl:attribute> <xsl:attribute name=”DISABLED”>DISABLED</xsl:attribute> </input>
en el ejemplo se esta seteando el nombre el cual es CHNON + el valor que trae el XML y se esta dejando DISABLED