XML
XML
XML
Esquemas XML
XML - Página 1
XML
© Fernando Berzal Galiano & Francisco Cortijo Bon
¿Qué es XML?
Sintaxis de XML
Documentos XML bien formados
Espacios de nombres
Tecnologías relacionadas
XML - Página 1
¿Qué es XML?
XML es el acrónimo de eXtensibe Markup Languaje. XML es un formato estándar del World
Wide Web Consortium (W3C) diseñado a partir de SGML para representar datos
estructurados de forma jerárquica (en un árbol). Los documentos XML incluyen una serie de
etiquetas que permiten crear documentos autocontenidos, en los que los datos van siempre
acompañados de sus metadatos correspondientes.
XML - Página 2
En resumen, XML permite representar datos de forma homogénea en entornos heterogéneos,
lo que facilita la interoperabilidad entre distintos sistemas. Además, hoy en día goza de gran
popularidad, pues todas las grandes empresas promueven su utilización y se han desarrollado
numerosas tecnologías basadas en este formato estándar (SOAP, ebXML, BizTalk,
WebSphere, etc.).
Un pequeño ejemplo
Representación de datos en formato ASCII (antes de que existiese XML):
"PO-1234","CUST001","X9876","5","14.98"
Representación de los mismos datos en XML:
<ORDEN_PEDIDO>
<COD__PEDIDO> PO-1234 </COD_PEDIDO>
<COD_CLIENTE> CUST001 </COD_CLIENTE>
<COD_ARTICULO> X9876 </ITEM_NUM>
<CANTIDAD> 5 </CANTIDAD>
<PRECIO> 14.98 </PRECIO>
</ORDEN_PEDIDO>
XML - Página 3
Sintaxis de XML
Antes de nada hay que resaltar que XML es sensible a las mayúsculas.
Elementos
Los elementos XML están delimitados por etiquetas de comienzo y fin entre las que se
escribe su contenido:
<TAG_NAME />
La primera línea es correcta en HTML, no en XML. La segunda si lo es:
Atributos
XML - Página 4
Los distintos elementos de un documento XML pueden incluir atributos que describen al
elemento en cuestión (tipo de datos, dominio de valores permitidos, etc.). Dichos atributos
han de aparecer en la etiqueta de comienzo del elemento y el valor del atributo debe
especificarse entre comillas dobles (") o simples ('):
<?xml version="1.0"?>
Un ejemplo más detallado en el que se especifica la hoja de estilo que se aplica al documento
para su presentación es el siguiente:
Entidad Sustitución
< <
> >
& &
' '
" "
XML permite que se puedan definir nuevas entidades. Algunas (parsed entities) pueden
contener texto y etiquetas XML, mientras que otras (unparsed entities) sirven para almacenar
XML - Página 5
cualquier tipo de datos (imágenes, sonidos...).
Entidades predefinidas
<!ENTITY lt "&#60;">
<!ENTITY gt ">">
<!ENTITY amp "&#38;">
<!ENTITY apos "'">
<!ENTITY quot """>
Comentarios y secciones CDATA
Finalmente, un documento XML también puede incluir comentarios, delimitados por las
construcciones <!-- y --> (exactamente igual que en HTML) y secciones CDATA que
sirven para incluir cualquier cosa (contenido textual) en el documento XML, delimitadas por
las construcciones <![CDATA[ y ]]> (como <PRE> ... </PRE> en HTML).
XML - Página 6
- Los subelementos deben estar adecuadamente anidados. Esto es, un elemento ha
de terminar con la misma etiqueta con la que comenzó.
- Los valores de los atributos han de estar delimitados por comillas dobles (") o
comillas simples (').
Teniendo en cuenta las estrictas reglas anteriores, el siguiente documento XML no es válido
porque sus elementos no están anidados correctamente:
Un documento XML
XML - Página 7
Un documento XML
ISBN='1-861003-11-0>
<Titulo>Poeta en Nueva York</Titulo>
<Autor>
<Nombre>Federico</Nombre>
<Apellido>García Lorca</Apellido>
</Autor>
<Precio>8.99</Precio>
</Libro>
<Libro Genero='Novela' FechaPublicacion='1967'
ISBN='0-201-63361-2'>
<Titulo>The Confidence Man</Titulo>
<Autor>
<Nombre>Herman</Nombre>
<Apellido>Melville</Apellido>
</Autor>
<Precio>11.99</Precio>
</Libro>
</Libreria>
XML - Página 8
Espacios de nombres
Los espacios de nombres (namespaces) permiten que XML sea extensible, permitiendo
diferencias entre etiquetas con el mismo nombre utilizando prefijos. De esta forma se pueden
evitar conflictos de nombres y el que diseña un documento XML puede centrarse en los datos
que tiene y cómo describirlos mejor. Además, el uso de identificadores universales URI
(Uniform Resource Identifier) para hacer referencia a estándares ampliamente aceptados
permite que se puedan combinar documentos escritos independientemente.
Sintaxis
xmlns: bk = "http://www.example.com/bookinfo/"
xmlns: bk = "urn:mybookstuff.org:bookinfo"
<LIBRO xmlns:bk="http://www.bookstuff.org/bookinfo">
<bk:TITULO>All About XML</bk:TITULO>
<bk:AUTOR>Joe Developer</bk:AUTOR>
<bk:PRECIO currency='US Dollar'>19.99</bk:PRECIO>
</LIBRO>
<bk:LIBRO xmlns:bk="http://www.bookstuff.org/bookinfo"
xmlns:money="urn:finance:money">
<bk:TITULO>All About XML</bk:TITULO>
<bk:AUTOR>Joe Developer</bk:AUTOR>
<bk:PRECIO money:currency='US Dollar'>19.99</bk:PRECIO>
</bk:LIBRO>
Combinar datos XML de distintas fuentes puede producir conflictos en los nombres de los
elementos y/o atributos. Supongamos que disponemos del siguiente fichero XML con nuestra
colección de libros:
XML - Página 9
libros.xml
<?xml version="1.0"?>
<COLECCION>
<ITEM Estado="in">
<TITULO>The Adventures of Huckleberry Finn</TITULO>
<AUTOR>Mark Twain</AUTOR>
<PRECIO>$5.49</PRECIO>
</ITEM>
<ITEM Estado="out">
<TITULO>Leaves of Grass</TITULO>
<AUTOR>Walt Whitman</AUTOR>
<PRECIO>$7.75</PRECIO>
</ITEM>
<ITEM Estado="out">
<TITULO>The Legend of Sleepy Hollow</TITULO>
<AUTOR>Washington Irving</AUTOR>
<PRECIO>$2.95</PRECIO>
</ITEM>
<ITEM Estado="in">
<TITULO>The Marble Faun</TITULO>
<AUTOR>Nathaniel Hawthorne</AUTOR>
<PRECIO>$10.95</PRECIO>
</ITEM>
</COLECCION>
discos.xml
<?xml version="1.0"?>
<COLECCION>
<ITEM>
<TITULO>Violin Concerto in D</TITULO>
<COMPOSITOR>Beethoven</COMPOSITOR>
<PRECIO>$14.95</PRECIO>
</ITEM>
<ITEM>
<TITULO>Violin Concertos Numbers 1, 2, and 3</TITULO>
<COMPOSITOR>Mozart</COMPOSITOR>
<PRECIO>$16.49</PRECIO>
</ITEM>
</COLECCION>
Queremos combinar estos documentos en uno solo, y además, queremos gestionarlo con una
sola aplicación. El problema surge al haber elementos repetidos (con el mismo nombre). Por
ejemplo, ¿Cómo hacer una lista de todos los libros? ¿Cómo calcular e precio medio de los
CDs? El mecanismo de los espacios de nombres facilita esta tarea: basta con definir un
espacio de nombres para diferenciar cada elemento. En el documento combinado cada
elemento de un libro (ITEM, TITULO, AUTOR y PRECIO) se asigna al espacio de nombres
book y cada uno de los elementos de un CD (ITEM, TITULO, COMPOSITOR y PRECIO) se
XML - Página 10
asigna al espacio de nombres cd.
Coleccion.xml
<?xml version="1.0"?>
<!-- Fichero: Coleccion.xml -->
<COLLECTION
xmlns:book="http://www.mjyOnline.com/books"
xmlns:cd="http://www.mjyOnline.com/cds">
<book:ITEM Estado="in">
<book:TITULO>
The Adventures of Huckleberry Finn
</book:TITULO>
<book:AUTOR>Mark Twain</book:AUTOR>
<book:PRECIO>$5.49</book:PRECIO>
</book:ITEM>
<cd:ITEM>
<cd:TITULO>Violin Concerto in D</cd:TITULO>
<cd:COMPOSITOR>Beethoven</cd:COMPOSITOR>
<cd:PRECIO>$14.95</cd:PRECIO>
</cd:ITEM>
<book:ITEM Estado="out">
<book:TITULO>Leaves of Grass</book:TITULO>
<book:AUTOR>Walt Whitman</book:AUTOR>
<book:PRECIO>$7.75</book:PRECIO>
</book:ITEM>
<cd:ITEM>
<cd:TITULO>
Violin Concertos Numbers 1, 2, and 3
</cd:TITULO>
<cd:COMPOSER>Mozart</cd:COMPOSER>
<cd:PRECIO>$16.49</cd:PRECIO>
</cd:ITEM>
<book:ITEM Estado="out">
<book:TITULO>
The Legend of Sleepy Hollow
</book:TITULO>
<book:AUTOR>Washington Irving</book:AUTOR>
<book:PRECIO>$2.95</book:PRECIO>
</book:ITEM>
<book:ITEM Estado="in">
<book:TITULO>The Marble Faun</book:TITULO>
<book:AUTOR>Nathaniel Hawthorne</book:AUTOR>
<book:PRECIO>$10.95</book:PRECIO>
</book:ITEM>
</COLLECTION>
XML - Página 11
situación, todos los elementos que aparezcan sin prefijo harán referencia al espacio de
nombres por defecto.
<LIBRO xmlns="http://www.bookstuff.org/bookinfo">
<TITULO>All About XML</TITULO>
<AUTOR>Joe Developer</AUTOR>
</LIBRO>
En el siguiente ejemplo el espacio de nombres por defecto es
http://www.mjyOnline.com/books ya que no se indica ningún prefijo en su
declaración.
Default.xml
<?xml version="1.0"?>
<!-- File Name: Default.xml -->
<COLECCION
xmlns="http://www.mjyOnline.com/books"
xmlns:cd="http://www.mjyOnline.com/cds">
<ITEM Estado="in">
<TITULO>
The Adventures of Huckleberry Finn
</TITULO>
<AUTOR>Mark Twain</AUTOR>
<PRECIO>$5.49</PRECIO>
</ITEM>
<cd:ITEM>
<cd:TITULO>Violin Concerto in D</cd:TITULO>
<cd:COMPOSER>Beethoven</cd:COMPOSER>
<cd:PRECIO>$14.95</cd:PRECIO>
</cd:ITEM>
<ITEM Estado="out">
<TITULO>Leaves of Grass</TITULO>
<AUTOR>Walt Whitman</AUTOR>
<PRECIO>$7.75</PRECIO>
</ITEM>
<cd:ITEM>
<cd:TITULO>
Violin Concertos Numbers 1, 2, and 3
</cd:TITULO>
<cd:COMPOSITOR>Mozart</cd:COMPOSITOR>
<cd:PRECIO>$16.49</cd:PRECIO>
</cd:ITEM>
<ITEM Estado="out">
<TITULO>The Legend of Sleepy Hollow</TITULO>
<AUTOR>Washington Irving</AUTOR>
<PRECIO>$2.95</PRECIO>
</ITEM>
<ITEM Estado="in">
XML - Página 12
Default.xml
<TITULO>The Marble Faun</TITULO>
<AUTOR>Nathaniel Hawthorne</AUTOR>
<PRECIO>$10.95</PRECIO>
</ITEM>
</COLECCION>
<LIBRO xmlns="www.bookstuff.org/bookinfo">
<TITULO>All About XML</TITULO>
<AUTOR>Joe Developer</AUTOR>
<EDITORIAL xmlns="urn:publishers:publinfo">
<NOMBRE>Microsoft Press</NOMBRE>
</EDITORIAL>
</LIBRO>
Namespaces y atributos
A diferencia de los elementos (que, salvo que se indique lo contrario, pertenecen al espacio de
nombres por defecto), los atributos NO pertenecen a ningún espacio de nombres, incluso
aunque exista un espacio de nombres por defecto.
XML - Página 13
Tecnologías relacionadas
XML en sí es bastante simple. Sin embargo, existen múltiples tecnologías relacionadas cuyo
aprendizaje requiere algo más de esfuerzo:
XML - Página 14
Esquemas XML
© Fernando Berzal Galiano & Francisco Cortijo Bon
Elementos
Atributos
Facetas
Estructuras de datos
Información adicional
XML es un formato abierto muy útil para enviar información de un sitio a otro. En ocasiones,
sin embargo, la flexibilidad de XML puede resultar contraproducente. ¿Cómo sabemos que
los datos contenidos en un documento XML son consistentes con los que esperábamos
recibir? Los esquemas XML nos permiten verificarlo. Los esquemas XML permiten
especificar el formato correcto de un documento XML de modo que podamos identificar
documentos bien formados (validar el documento XML).
Los esquemas XML y las definiciones DTD suelen especificarse en ficheros independientes,
lo que facilita la tarea de mantenimiento ya que un solo fichero (de esquema o DTD) puede
servir de referencia a muchos ficheros de datos XML.
<?xml version="1.0"?>
<!DOCTYPE Libro SYSTEM "libro.dtd">
.....
SYSTEM sirve para DTDs "personales". Se puede espicificar un fichero local o un fichero
accesible a través de una URL. Se puede especificar una DTD pública con PUBLIC, en la que
queda reflejado el propietario de la misma, una descripción y el idioma.
<?xml version="1.0"?>
<!ELEMENT Libro
(Titulo, Catalogo:Seccion, Catalogo:SubSeccion,
Contenido, Compra, Copyright)>
<!ATTLIST Libro
xmlns CDATA #REQUIRED
xmlns:Catalogo CDATA #REQUIRED
>
<!ELEMENT Titulo (#PCDATA)>
<!ELEMENT Catalogo:Seccion (#PCDATA)>
<!ELEMENT Catalogo:SubSeccion (#PCDATA)>
<!ELEMENT Contenido ((Capitulo+)|(Capitulo+, Separacion?)+)>
<!ELEMENT Capitulo (Tema, Seccion+)>
<!ATTLIST Capitulo
materia (XML|Java) "Java"
>
<!ELEMENT Tema (#PCDATA)>
<!ELEMENT Seccion (#PCDATA)>
<!ATTLIST Seccion
apartados CDATA #REQUIRED
dificil (si|no) "no"
>
<!ELEMENT Separacion EMPTY>
<!ELEMENT Compra (#PCDATA)>
<!ELEMENT Copyright (#PCDATA)>
Elementos
Los elementos permitidos se especifican con ELEMENT, seguido del nombre y el tipo del
elemento. Los elementos que se pueden anidar dentro de otros se especifican entre paréntesis
y separados por comas. Importa el orden. El tipo menos restrictivo es ANY, que permite
cualquier contenido para un elemento. Para datos de tipo texto, se usa #PCDATA. Para
elementos vacíos, EMPTY.
Atributos
Los atributos permitidos para un elemento se especifican con ATTLIST y el nombre del
elemento seguido de los nombres de los atributos, con un tipo y modificador obligatorios. El
tipo del atributo puede ser CDATA para cualquier valor, o una enumeración de los valores
permitidos.
Otros posibles tipos son: NMTOKEN para restringir el valor a un nombre XML válido (es
decir, que empiece con una letra o guión de subrayado y contenga sólo letras, números,
guiones de subrayado, guiones y puntos, sin espacios) ID, además de las restricciones que
impone NMTOKEN, impone que el valor sea único en todo el documento. El modificador
puede ser #REQUIRED para atributos obligatorios, #IMPLIED para opcionales, o #FIXED
valor_fijo para valores fijos. También puede ser un valor por defecto.
El siguiente ejemplo muestra un sencillo esquema XML que podría ser útil para gestionar los
productos existentes en un almacén:
Los elementos se utilizan para especificar las etiquetas válidas en un documento XML
(name) y su tipo (type), tal como aparece en el ejemplo anterior del almacén. Además, el
orden en que aparecen los elementos en el esquema XML determina el orden en que han de
aparecen dentro de un documento XML que se ajuste al esquema.
La siguiente tabla muestra algunos de los tipos permitidos y su equivalencia con los tipos de
la plataforma .NET:
Los atributos son similares a los elementos, si bien un atributo ha de ser de un tipo simple y
tiene declararse justo antes de cerrar la etiqueta xsd:complexType. A diferencia de los
elementos, los atributos pueden aparecer en cualquier orden y no pueden incluir otros
elementos (al ser de tipos simples). No obstante, su característica más interesante es que
pueden ser opcionales y se les puede asignar un valor por defecto:
Las facetas forman parte de la definición de elementos y atributos de un esquema XML y nos
permiten especificar restricciones adicionales sobre los datos que pueden aparecer en un
documento XML válido:
Por ejemplo, podemos definir un tipo de dato que sólo permita almacenar valores enteros
entre 0 y 10:
Rango de valores
<xsd:simpleType name="nota">
<xsd:restriction base="decimal">
<xsd:minInclusive value="0" fixed="true" />
<xsd:maxInclusive value="10" fixed="true" />
</xsd:restriction>
</xsd:simpleType>
El tipo nota que hemos definido está basado en el tipo intrínseco decimal y, en su
definición, se especifican dos facetas (su valor mínimo y su valor máximo). El uso de fixed
evita que alguien pueda modificar las facetas especificadas en la definición del tipo (por
ejemplo, al declarar un nuevo tipo basado en nota).
Tipo enumerado
<xsd:simpleType name="sexo">
<xsd:restriction base="xsd:string">
<xsd:enumeration value="hombre"/>
<xsd:enumeration value="mujer"/>
<xsd:enumeration value="???"/>
</xsd:restriction>
</xsd:simpleType>
O incluso especificar un patrón al que han de atenerse los valores válidos de un tipo
(utilizando expresiones regulares):
SKU (Stock Keeping Unit): Código para identificar productos (p.ej. 976-FB)
<xsd:simpleType name="SKU">
<xsd:restriction base="xsd:string">
<xsd:pattern value="\d{3}-[A-Z]{2}"/>
</xsd:restriction>
</xsd:simpleType>
Además de poder especificar tipos enumerados y expresiones regulares, las facetas incluidas
en el estándar XSD permiten especificar la longitud de una cadena o de una lista (length,
minLength y maxLength), si se permite la presencia de espacios en blanco (whiteSpace),
el intervalo de valores permitido (minInclusive, minExclusive, maxInclusive,
maxExclusive) y el número de dígitos de un valor decimal (totalDigits y
fractionDigits).
Los tipos complejos como el utilizado en el ejemplo del almacén son similares a los tipos
enumerados y, en concreto, suelen utilizarse para representar tablas. Si le asignamos un
nombre al tipo especificado, lo que estamos haciendo es definir un tipo abstracto que se podrá
utilizar en la definición de otros elementos, como en:
<xsd:schema
xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<xsd:element name="purchaseOrder"
type="PurchaseOrderType"/>
<xsd:element name="comment" type="xsd:string"/>
<xsd:complexType name="PurchaseOrderType">
<xsd:sequence>
<xsd:element name="shipTo" type="Address"/>
<xsd:element name="billTo" type="Address"/>
<xsd:element ref="comment" minOccurs="0"/>
<xsd:element name="items" type="Items"/>
</xsd:sequence>
<xsd:attribute name="orderDate" type="xsd:date"/>
</xsd:complexType>
<xsd:complexType name="Address">
<xsd:sequence>
<xsd:element name="name" type="xsd:string"/>
<xsd:element name="street" type="xsd:string"/>
<xsd:element name="city" type="xsd:string"/>
<xsd:element name="zip" type="xsd:decimal"/>
</xsd:sequence>
</xsd:complexType>
<xsd:complexType name="Items">
<xsd:sequence>
<xsd:element name="item"
minOccurs="0" maxOccurs="unbounded">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="product" type="xsd:string"/>
<xsd:element name="quantity" type="xsd:integer" />
<xsd:element name="price" type="xsd:decimal"/>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
</xsd:sequence>
</xsd:complexType>
</xsd:schema>
Cuando nos interesa permitir que en dentro de un elemento aparezcan elementos alternativos
<xsd:complexType name="PurchaseOrderType">
<xsd:sequence>
<xsd:choice>
<xsd:group ref="shipAndBill"/>
<xsd:element name="singleAddress" type="Address"/>
</xsd:choice>
<xsd:element ref="comment" minOccurs="0"/>
<xsd:element name="items" type="Items"/>
</xsd:sequence>
<xsd:attribute name="orderDate" type="xsd:date"/>
</xsd:complexType>
<xsd:group name="shipAndBill">
<xsd:sequence>
<xsd:element name="shipTo" type="Address"/>
<xsd:element name="billTo" type="Address"/>
</xsd:sequence>
</xsd:group>
Aparte de definir tipos estructurados, XSD nos permite definir listas como si fuesen tipos de
datos simples. Por ejemplo, en el documento XML:
<xsd:simpleType name="lista">
<xsd:list itemType="xsd:integer"/>
</xsd:simpleType>
Además, los esquemas XML nos permiten definir claves, tanto primarias como externas:
<xsd:schema targetNamespace="http://elvex.ugr.es/informe"
xmlns="http://elvex.ugr.es/informe"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
attributeFormDefault="unqualified"
elementFormDefault="qualified">
<xsd:annotation>
<xsd:documentation xml:lang="es">
Informe de proveedores y piezas
</xsd:documentation>
</xsd:annotation>
<xsd:element name="informe">
<xsd:complexType>
<xsd:sequence>
<informe xmlns="http://elvex.ugr.es/informe"
fecha="2002-12-31">
<proveedores>
<proveedor id="95819">
<suministro sku="872-AA" cantidad="1" />
<suministro sku="926-AA" cantidad="1" />
<suministro sku="833-AA" cantidad="1" />
<suministro sku="455-BX" cantidad="1" />
</proveedor>
<proveedor id="63143">
<suministro sku="455-BX" cantidad="4" />
</proveedor>
</proveedores>
<piezas>
<pieza sku="872-AA">Monitor</pieza>
<pieza sku="926-AA">Impresora</pieza>
<pieza sku="833-AA">Escáner</pieza>
<pieza sku="455-BX">CD-R</pieza>
</piezas>
</informe>
http://www.w3c.org/TR/xmlschema-0/
Visual Studio incluye una herramienta (el diseñador XML) que nos permite hacer casi de todo
con documentos XML y esquemas XSD de una forma similar a como se trabaja con bases de
datos en Access.
En el menú Archivo, elija Nuevo y, a continuación, haga clic en Proyecto para mostrar
el cuadro de diálogo Nuevo proyecto. Seleccione Proyectos de Visual C# en el
panel Plantillas y, a continuación, seleccione Aplicación para Windows. Asigne
al proyecto el nombre EjemploEsquema.
- Agregar un esquema XML al proyecto.
Antes de crear la tabla relacional, primero creará definiciones de tipos simple y complejo que
utilizará para dar formato a elementos específicos del esquema de pedido. Los nuevos tipos se
crean utilizando tipos de datos XML existentes, como string e integer.
En primer lugar definirá un tipo simple, que se denominará CodigoProvincia. Este tipo
simple se utilizará para limitar el tamaño de una cadena a dos caracteres.
- Agregar un objeto simpleType al proyecto.
<xs:simpleType name="CodigoProvincia">
<xs:restriction base="xs:string">
<xs:length value="2" />
</xs:restriction>
</xs:simpleType>
- Añada nuevos elementos al tipo complejo de manera que tenga un aspecto similar
al siguiente en la vista de esquema:
<xs:complexType name="TipoDireccion">
<xs:sequence>
<xs:element name="Nombre" type="xs:string" />
<xs:element name="Calle" type="xs:string" />
<xs:element name="Ciudad" type="xs:string" />
<xs:element name="Provincia"
type="CodigoProvincia" />
<xs:element name="CodPostal" type="xs:integer"/>
</xs:sequence>
</xs:complexType>
Se trata de crear una taba relacional llamada Pedidos, agregar un elemento Items a esa
tabla, especificando que Items sea, a su vez, de tipo complexType sin nombre, lo que
permite la repetición de objetos Item para un sólo registro de pedido.
Como se está definiendo una nueva tabla relacional hace que aparezca un nuevo elemento en
la superficie de diseño. En la relación de nuevos Items , al agregar el elemento Item y
establecer su tipo en complexType sin nombre, se crea otra tabla relacional, que también
aparece en el superficie de diseño.
- Agregar un elemento al proyecto.
<xs:element name="Pedidos">
<xs:complexType>
<xs:sequence>
<xs:element name="EnviarA"
type="TipoDireccion" />
<xs:element name="FacturarA"
type="TipoDireccion" />
</xs:sequence>
</xs:complexType>
</xs:element>
En primer lugar asociaremos a este fichero XML el esquema que creamos anteriormente. En
la ventana de Propiedades, seleccionar DOCUMENT, y en la propiedad targetSchema
seleccionar el esquema de la lista desplegable:
Esta ayuda es contextual, por lo que si estamos completando el elemento EnviarA, la ayuda
ofrecida será:
Si cambiamos el modo de vista a Datos encontramos una interfaz cómoda que permite
añadir, modificar, borrar, etc:
Se trata de realizar un esquema XML y de crear un fichero de datos para guardar los datos de
nuestra biblioteca personal. La biblioteca consta de una serie (indeterminada en número) de
libros. Cada libro se identifica por: título, autor, número de páginas, precio y tipo de
encuadernación. Para hacer más fácil su clasificación se quieren registrar los géneros
(literarios) en los que puede encuadrarse el libro, teniendo en cuenta que un libro puede tener
asociado un número máximo de cinco géneros. Finalmente, queremos tener en cuenta si el
libro está disponible o no (se supone entonces que lo hemos prestado).
Antes de empezar con el esquema debemos tener en cuenta algunas consideraciones que nos
facilitarán la tarea de diseño:
- El precio de un libro debe ser de tipo real (con decimales...) y el valor mínimo
debe ser 0.
- Queremos que la etiqueta de cada género tenga una longitud mínima de 1 carácter.
Se trata de definir en primer lugar los tipos simples y a continuación los tipos complejos que
hagan uso de los tipos simples ya definidos. Dejaremos los géneros para el final.
- Arrastre un objeto simpleType hasta la superficie del diseñador y cambie el
nombre del tipo por TipoPrecio, establezca el tipo base a float y restrinja su
valor mínimo a 0.0: colóquese en la primera columna de la fila siguiente,
seleccione facet en la lista desplegable, colóquese en la siguiente celda,
seleccione minInclusive en la lista desplegable y establezca el valor 0.0 en
la siguiente columna.
Cambie element1 a Biblioteca para asignar un nombre al elemento. Puede dejar el tipo
de datos como queda por defecto: (Biblioteca).
Recordemos que cada libro tiene, al menos, un género asociado y que queremos restringir el
número máximo de géneros a 5. La idea es que si un libro tiene, por ejemplo, dos géneros, su
código XMl será así:
...
<Biblioteca>
<Libro>
<Autor>Arturo Pérez Reverte</Autor>
<Titulo>El capitán Alatriste</Titulo>
...
<Generos>
<Genero>Novela</Genero>
<Genero>Historica</Genero>
</Generos>
</Libro>
...
</Biblioteca>
Escribir el contenido del fichero y validar los datos contra el esquema. Utilizar estos datos
Transformaciones XSLT
Introducción
Ventajas y desventajas
Formas de uso
Ventajas:
- Fácil de aprender y utilizar. Muchos desarrolladores ya lo conocen.
Desventajas:
- Utiliza una sintaxis diferente a la del XML.
- No es muy flexible:
- No permite realizar manipulaciones sobre el documento, tales como añadir y
borrar elementos, realizar ordenaciones, etc.
Para usar una hoja de estilo CSS para presentar el contenido de un documento XML hay que
añadir la siguiente línea en el prólogo:
Un ejemplo sencillo
En primer lugar veremos cómo crear una hoja de estilo con Visual Studio .NET.
Se trata de especificar el formato de cada elemento del documento XML especificando una
regla para cada elemento.
Como no hay ningún elemento llamado body lo borramos y escribimos, por ejemplo,
Titulo. Observar como se modifica el explorador de elementos en la parte izquierda del
diseñador CSS:
Dominar este asistente es cuestión de experimentar con él... Sin embargo debe saber dos cosas
importantes:
- Solo aparecen con formato los elementos que se han especificado y configurado.
/* Fichero: MiHojaCSS.css */
Titulo
{
display: block;
Introducción
XSLT es el acrónimo de EXtensible Stylesheet Languaje Transformation.
XSL es un lenguaje que nos permite definir una representación o formato pra un documento
XML. Un mismo documento XML puede tener varias hoas de estilo XSL que lo muestren en
diferentes formatos (HTML, PDF, RTF, PostScript, etc.) Básicamente, XSL es un lenguaje
que define la transformación entre un documento XML de entrada y otro documento XML de
salida.
La aplicación de una hoja de estilo XSL a un documento XML puede ocurrir tanto en el
origen (por ejemplo, un servlet que convierta de XML a HTML para que sea mostrado en el
navegador de un ordenador conectado a un servidor web) o en el mismo navegador (por
ejemplo, Internet Explorer 6).
- XSL-FO (XSL Formatting Objects): Especificación que trata cómo deben ser los
objetos de formato para convertir XML a formatos binarios (PDF, Word,
imágenes, etc.). Todavía no ha alcanzado el estado de "recomendado por la
W3C".
Ventajas y desventajas
Ventajas:
- La salida no tiene por qué ser HTML para visualización en un navegador, sino
que puede estar en muchos formatos.
- XSLT es un lenguaje XML, por lo que no hay que aprender nada especial acerca
de su sintaxis.
Desventajas:
- Su utilización es más compleja.
Formas de uso
- Visualizar directamente en un navegador el documento XML que tiene asociada
una hoja XSLT. El navegador debe tener incorporado un procesador XSLT.
Para usar un fichero XSLT desde un documento XML hay que añadir la siguiente línea en el
prólogo:
Por ejemplo, modificaremos el fichero LibrosDeCasa.xml para que quede como sigue:
- Una hoja de estilo XSL consta de una serie de reglas que determinan cómo va a
ocurrir la transformación. Cada regla se compone de:
- patrón (pattern).
- La parte central describe qué debe hacerse cuando se produce una coincidencia.
- La marca de cierre.
Así, cada elemento template se asocia con un fragmento del documento XML
(que puede ser un elemento o un conjunto de elementos) y se transforma en otro
fragmento de XML o HTML, de acuerdo a lo que se especifique en su interior.
- El procesador entonces:
- Carga los patrones especificadas en la hoja de estilo...
<xsl:apply-templates />
<xsl:apply-templates select="PATRON">
.....
<xsl:apply-templates />
<xsl:for-each select="PLANTILLA">
.....
<xsl:for-each />
<xsl:choose>
<xsl:when test="EXPRESIÓN 1"> ... </xsl:when />
<xsl:when test="EXPRESIÓN 2"> ... </xsl:when />
.....
<xsl:otherwise> ... </xsl:otherwise />
<xsl:choose />
<xsl:sort select="/Biblioteca/Libro/NumPags"
order="ascending" />
En este ejemplo hemos hecho uso de un patrón algo complejo que responde a una
expresión de XPath que puede interpretarse así: De la raiz del documento XML
XPath
Los patrones pueden ser muy complejos y, como hemos indicado, se especifican en un
lenguaje llamado XPath. Es un lenguaje de consulta usado para identificar y seleccionar
nodos (elementos) de un documento XML. Se caracteria por:
- Es declarativo (vs. procedimental).
Los operados empleados habitualmente para formar los patrones se describen en la siguiente
tabla:
Operador Descripción
/ Selección de hijo. Selecciona únicamente
a los descendientes directos. Al principio
del patrón el contexto es la raíz del
documento.
// Selección de descendientes. Selecciona
todos los descendientes.
. Selección del elemento actual (el
contexto).
* Todos (en el sentido habitual de este
operador)
@ Prefijo que se antepone al nombre de un
atributo.
[] Filtro sobre el conjunto de nodos
seleccionado.
Algunos ejemplos:
./AUTOR Selecciona todos los elementos AUTOR dentro del contexto actual (todos los hijos
del nodo actual que tengan como etiqueta AUTOR).
/LIBROS Selecciona los elementos (posiblemente uno solo) con etiqueta LIBROS que
cuelgan directamente de la raiz.
Ejemplo 1
Se trata de mostrar una lista con todos los libros. Se incluye un encabezado y solo se muestra
el título de cada libro.
......
......
<xsl:if test="NumPags > $NumPagsVol">
......
Ejemplo 5
En este ejemplo practicamos con casi todos los elementos para construir una tabla que
recopila toda la información del documento XML.
Tipos de nodos
Conclusiones
La clase XmlDocument
Miembros de XmlDocument
Conjuntos de datos
Introducción
DOM (Document Object Model o modelo de objetos de documento) es un estándard de la
W3C que especifica la forma de acceder y manipular los datos de un documento XML
mediante un programa.
En la figura siguiente se muestra cómo se estructura la memoria cuando se leen los datos de la
biblioteca (XML) en la estructura DOM.
Tipos de nodos
A medida que el contenido XML se lee en el DOM las partes se traducen en nodos que
mantienen metadatos adicionales acerca de sí mismos, como su tipo y valores. Esto es,
cuando se leen varios datos, se asigna a cada nodo un tipo. Esto es importante ya que no todos
los nodos son del mismo tipo y e tipo determina las características y funcionalidad del nodo
(qué acciones pueden realizarse y qué propiedades pueden establecerse o recuperarse).
En la tabla siguiente se muestran algunos tipos de nodo, el objeto asociado a dicho tipo y una
breve dscripción.
- La mayor parte de los nodos pueden tener varios nodos secundarios, que son los
que están situados inmediatamente debajo de ellos. Los tipos de nodo que pueden
tener nodos secundarios son Document, DocumentFragment,
EntityReference, Element y Attribute
Es importante hacer esta distinción, debido a los métodos utilizados para desplazarse por los
nodos relacionados, principales y secundarios del DOM. Por ejemplo, los métodos
PreviousSibling y NextSibling no se utilizan para desplazarse de un elemento a un
atributo, ni entre atributos. En su lugar, un atributo es una propiedad de un elemento y
pertenece a un elemento, tiene una propiedad OwnerElement y no una propiedad
parentNode, y tiene métodos de desplazamiento distintos.
Conclusiones
DOM resulta útil para leer datos XML en la memoria y cambiar su estructura, agregar
o quitar nodos, o modificar los datos mantenidos en un nodo como en el texto contenido
en un elemento. No obstante, hay otras clases disponibles que son más rápidas que DOM en
otros escenarios:
- Para tener un acceso rápido, sólo hacia delante y sin almacenamiento en caché
a secuencias de XML, utilice XmlReader y XmlWriter.
- System.Xml.XPath.
El espacio de nombres System.Xml.XPath contiene el motor de evaluación y
- System.Xml.Schema.
El espacio de nombres System.Xml.Schema contiene las clases XML que
proporcionan compatibilidad basada en normas para los esquemas de XSD ó
lenguaje de definición de esquemas XML (
www.w3.org/XML/Schema
).
- System.Xml.Serialization.
El espacio de nombres System.Xml.Serialization contiene clases que se
utilizan para serializar objetos en secuencias o documentos con formato XML.
- Modificar nodos.
- Borrar nodos.
Miembros de XmlDocument
Constructores
XmlDocument Inicializa una nueva instancia de la clase
XmlDocument.
Propiedades públicas
Attributes Obtiene un objeto
XmlAttributeCollection que
contiene los atributos de este nodo.
ChildNodes Obtiene todos los nodos secundarios del
nodo.
DocumentElement Obtiene el XmlElement raíz del
documento.
FirstChild Obtiene el primer nodo secundario del
nodo.
HasChildNodes Obtiene un valor que indica si este nodo
tiene nodos secundarios.
LatChild Obtiene el último nodo secundario del
nodo.
LocalName / Name Obtiene el nombre local/completo del
nodo.
NextSibling Obtiene el nodo inmediatamente siguiente
Métodos públicos
AppendChild Agrega el nodo especificado al final de la
lista de nodos secundarios de este nodo.
CreateAttribute Crea un XmlAttribute con el nombre
especificado.
CreateComment Crea un objeto XmlComment que contiene
los datos especificados.
CreateElement Crea un objeto XmlElement.
CreateNode Crea un objeto XmlNode.
CreateTextNode Crea un objeto XmlText con el texto
especificado.
GetElementsByTagName Devuelve un objeto XmlNodeList que
contiene una lista de todos los elementos
descendientes que coinciden con el
nombre especificado.
InsertAfter Inserta el nodo especificado
inmediatamente detrás del nodo de
referencia igualmente especificado.
InsertBefore Inserta el nodo especificado
inmediatamente antes del nodo de
referencia igualmente especificado.
Load Carga los datos XML especificados.
using System;
using System.IO;
using System.Xml;
class BibliotecaApp
{
static void Main(string[] args)
{
// Crear el documento en memoria y cargarlo
XmlDocument doc = new XmlDocument();
doc.Load ("../../LibrosDeCasa.xml");
Si desea obtener todos los atributos de un nodo de elemento en una colección, llame a la
propiedad XmlElement.Attributes. De este modo se obtiene la
XmlAttributeCollection que contiene todos los atributos de un elemento. Cada
elemento de la colección de atributos representa un nodo XmlAttribute. Para buscar el
número de atributos de un elemento, obtenga el XmlAttributeCollection y utilice la
propiedad Count para saber cuántos nodos XmlAttribute hay en la colección.
La información de una colección de atributos puede recuperarse por nombre (ver la línea de
código XmlAttribute atr = atrCol["ISBN"] en el siguiente ejemplo) o por
número de índice (sustituir la anterior por XmlAttribute atr = atrCol[1]).
class BibliotecaApp
{
static void Main(string[] args)
{
// Crear el documento en memoria
XmlDocument doc = new XmlDocument();
doc.LoadXml("<Libro Genero='Novela' " +
"ISBN='1-861001-57-5' " +
"Comentario='mal estado'>" +
"<Titulo>El oro del Rey</Titulo>" +
"<Precio>14.95</Precio>" +
"</Libro>");
// Colocarse en la raiz del documento.
XmlElement Raiz = doc.DocumentElement;
// Recuperar los atributos en una coleccion.
XmlAttributeCollection atrCol = Raiz.Attributes;
// De manera resumida:
// XmlAttributeCollection atrCol =
// doc.DocumentElement.Attributes;
// Mostrar los atributos de la coleccion iterando
// sobre los elementos de la coleccion.
Console.WriteLine("Atributos en la coleccion: ");
for (int i=0; i < atrCol.Count; i++)
{
Console.Write(" {0} = ", atrCol[i].Name);
Console.Write(" {0}", atrCol[i].Value);
Console.WriteLine();
}
// Recuperar un unico atributo (el llamado ISBN)
if (Raiz.HasAttribute("ISBN"))
{
// Seleccionar nombre
XmlAttribute atr = atrCol["ISBN"];
// Seleccionar valor
String ValorISBN = atr.InnerXml;
Console.WriteLine();
Console.Write ("Valor del atributo ISBN: ");
Console.WriteLine(ValorISBN);
}
Console.ReadLine();
..........
// Colocarse en la raiz del documento.
XmlElement Raiz = doc.DocumentElement;
// Recuperar el atributo ISBN.
XmlAttribute atr = Raiz.GetAttributeNode("ISBN");
// Seleccionar valor
String ValorISBN = atr.InnerXml;
// Mostrar su valor
Console.Write ("Valor del atributo ISBN: ");
Console.WriteLine(ValorISBN);
// De otra manera:
String ValorISBNAlt = Raiz.GetAttribute("ISBN");
Console.Write ("Valor del atributo ISBN (alt): ");
XmlReader es una clase base abstracta que proporciona acceso de sólo avance y de sólo
lectura sin almacenamiento en caché. Esto significa, por ejemplo, que no hay funciones para
editar los valores de un atributo o contenido de un elemento, ni la posibilidad de agregar y
quitar nodos. La lectura se realiza por el método de primero en profundidad (como se lee
textualmente XML).
El nodo actual hace referencia al nodo en el que está situado el lector. Para avanzar el lector,
utilice cualquiera de los métodos de lectura. Las propiedades reflejan el valor del nodo actual.
En las siguientes tablas resumimos algunos de los componentes más destacados de la clase
XmlTextReader:
Constructores
XmlTextReader Inicializa una nueva instancia de la clase
XmlTextReader.
Métodos públicos
Close Cambia la propiedad ReadState a
Closed.
MoveToElement Se desplaza hasta el elemento que
contiene el nodo de atributo actual.
Read Lee el siguiente nodo de la secuencia.
Skip Omite los nodos secundarios del nodo
actual.
Otras clases derivadas de XmlReader son:
- XmlNodeReader. Representa un lector que proporciona acceso rápido a datos
XML, sin almacenamiento en caché y con desplazamiento sólo hacia delante en
un XmlNode. XmlNodeReader puede leer un subárbol DOM XML. Esta clase
no admite la validación de DTD ni de esquemas. Para realizar la validación de
datos, utilice XmlValidatingReader.
Xmlwriter es una clase base abstracta que proporciona acceso de sólo avance y de sólo
escritura sin almacenamiento en caché para escribir código XML.
En la lista siguiente se muestra el propósito de los métodos y propiedades que incluye la clase
La transformación se aplica con el método Transform que transforma los datos XML
utilizando la hoja de estilos XSLT que se ha cargado.
Ejemplo 1
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/Biblioteca">
<ResumenBiblioteca>
<xsl:apply-templates />
</ResumenBiblioteca>
</xsl:template>
<xsl:template match="Libro">
<item>
<xsl:value-of select="Titulo" />
</item>
</xsl:template>
</xsl:stylesheet>
using System;
using System.IO;
using System.Xml;
using System.Xml.Xsl;
class BibliotecaApp
{
static void Main(string[] args)
{
// Crear objeto XSLT y leer fichero XSLT.
XslTransform xslt = new XslTransform();
xslt.Load("../../TransfSimple.xslt");
// Crear objeto XML y leer fichero XML.
.........
// Aplicar la transformación y guardar el
// resultado en un fichero.
xslt.Transform("../../LibrosDeCasa.xml",
"../../Resumen.xml", null);
.........
using System;
using System.IO;
using System.Xml;
using System.Xml.Xsl;
class BibliotecaApp
{
static void Main(string[] args)
{
// Crear objeto XSLT y leer fichero XSLT.
XslTransform xslt = new XslTransform();
xslt.Load("../../TransfSimple.xslt");
// Crear objeto XML y leer fichero XML.
XmlDocument doc = new XmlDocument();
doc.Load("../../LibrosDeCasa.xml");
// Aplicar la transformación y presentar el
// resultado en la consola.
XmlTextWriter writer =
new XmlTextWriter (Console.Out);
writer.Formatting = Formatting.Indented;
writer.Indentation = 4;
writer.WriteStartDocument(true);
xslt.Transform(doc, null, writer, null);
Console.ReadLine();
}
}
using System;
using System.IO;
using System.Xml;
using System.Xml.Xsl;
class BibliotecaApp
{
static void Main(string[] args)
{
// Crear objeto XSLT y leer fichero XSLT.
XslTransform xslt = new XslTransform();
xslt.Load("../../TransfSimple.xslt");
// Crear objeto XML y leer fichero XML.
XmlDocument doc = new XmlDocument();
doc.Load("../../LibrosDeCasa.xml");
XmlTextWriter rdo = new
XmlTextWriter("../../Resumen2.xml", null);
rdo.Formatting = Formatting.Indented;
rdo.WriteStartDocument(true);
xslt.Transform(doc, null, rdo, null);
Console.ReadLine();
}
}
y el resultado es:
......
XmlTextWriter rdo =
new XmlTextWriter("../../Resumen3.xml",
System.Text.Encoding.UTF8);
......
hace que se modifique el prólogo del fichero XML incorporando la codificación UTF-8:
El siguiente ejemplo usa el modelo de cursor para calcular el precio medio de los libros.
Utilice el XPathNodeIterator para establecer una iteración en un conjunto de nodos.
using System;
using System.IO;
using System.Xml;
using System.Xml.XPath;
class BibliotecaApp
{
static void Main(string[] args)
{
// Abre para lectura el fichero XML
XPathDocument doc =
new XPathDocument ("../../LibrosDeCasa.xml");
// Crea un objeto XPathNavigator (nav) para
// desplazarse por doc
XPathNavigator nav = doc.CreateNavigator();
// Selecciona un conjunto de nodos utilizando la
El método Evaluate evalúa la cadena que representa a una expresión XPath y devuelve el
resultado de tipo (número, valor booleano, cadena o conjunto de nodos).
using System;
using System.IO;
using System.Xml;
using System.Xml.XPath;
class BibliotecaApp
{
static void Main(string[] args)
{
// Abre para lectura el fichero XML
XPathDocument doc =
new XPathDocument ("../../LibrosDeCasa.xml");
// Crea un objeto XPathNavigator (nav) para
// desplazarse por doc
XPathNavigator nav = doc.CreateNavigator();
// Selecciona un conjunto de nodos utilizando la
// expresión XPath especificada.
XPathNodeIterator it =
nav.Select("/Biblioteca/Libro/Precio");
int nl = it.Count;
Console.WriteLine ("Numero total de libros= {0}",nl);
// Compila una cadena que representa a una expresión
// XPath y devuelve una expresion XPath
XPathExpression expr =
nav.Compile("sum(/Biblioteca/Libro/Precio)");
// Evalua la expresion
double SumPrecio2 = (double) nav.Evaluate(expr);
using System;
using System.IO;
using System.Xml;
using System.Xml.XPath;
class BibliotecaApp2
{
static void Main(string[] args)
{
Console.WriteLine ("Lista de libros\n");
// Lee en doc un fichero XML
XmlDocument doc = new XmlDocument ();
doc.Load("../../MisLibros.xml");
// Crea un objeto XPathNavigator (nav) para
// desplazarse por doc
XPathNavigator nav = doc.CreateNavigator();
// Accede al primer hijo de "doc": <Biblioteca>
nav.MoveToFirstChild();
int nl= 1;
int sum = 0;
// Accede al primer <Libro>
nav.MoveToFirstChild();
// Escibe los datos del primer libro
Console.Write ("Libro {0}: ", nl);
// Accede y pinta el primer campo (<Titulo>)
nav.MoveToFirstChild();
Console.Write (nav.Value);
// Saltar campo <Autor> y colocarse en <NumPags>
for (int i=0; i<2; i++)
nav.MoveToNext();
Console.WriteLine (" ({0} págs.)", nav.Value);
sum += XmlConvert.ToInt16(nav.Value);
// Volver al nodo <Libro>
Introducción
El objetivo primario de la serialización en .NET es permitir la conversión de documentos
XML y flujos (streams) en objetos CLR y viceversa. Esta conversión se realizará en tiempo
de ejecución. Esta conversión supone que la manipulación de los objetos será más sencilla
que hacerlo con otras técnicas comunes (programas que hacen uso de DOM, por ejemplo).
La clase fundamental para esta tarea es XmlSerializer. Esta clase se emplea para
serializar y deserializar objetos en y desde documentos XML. XmlSerializer permite
controlar el modo en que se codifican los objetos en XML.
using System;
using System.IO;
using System.Xml.Serialization;
namespace XSDSample
{
public class Test
{
public String cad;
}
class SerialApp {
// Clase serializable
public class Test
{
public Test() {} // Igual que no ponerlo
public String cad;
}
// Clase NO serializable
public class Test2
{
public Test2(String cadena)
{
this.cad = cadena;
}
public String cad;
}
<?xml version="1.0"?>
<Cliente
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
/>
<?xml version="1.0"?>
<Cliente
Ejemplo
using System;
using System.IO;
using System.Xml;
using System.Xml.Serialization;
namespace SerDeserSample
{
public class Cliente
{
public string Nombre;
public string Direccion;
public string Telefono;
public override string ToString() {
string s1 = "Un cliente:"+"\n";
string s2 = " Nombre: " + this.Nombre + "\n";
string s3 = " Dirección: " + this.Direccion + "\n";
string s4 = " Teléfono: " + this.Telefono+ "\n";
return (s1+s2+s3+s4);
}
}
class SerDeserSampleApp {
static void Main(string[] args)
{
Cliente c = new Cliente();
c.Nombre = "Juan";
c.Direccion = "Casa de Juan S/N";
c.Telefono = "333444555";
Console.WriteLine ("Antes de guardar");
Console.WriteLine (c);
// Serializar
XmlSerializer ser = new
XmlSerializer (typeof(Cliente));
FileStream OStream = new FileStream ("Juan.xml",
FileMode.OpenOrCreate);
ser.Serialize (OStream, c);
<?xml version="1.0"?>
<Cliente
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<Nombre>Juan</Nombre>
<Direccion>Casa de Juan S/N</Direccion>
<Telefono>333444555</Telefono>
</Cliente>
using System;
using System.IO;
using System.Xml;
using System.Xml.Serialization;
namespace SerDeserSample
{
[XmlRoot("cliente")]
public class Cliente
{
public string Nombre;
public string Direccion;
public string Telefono;
public override string ToString() {
string s1 = "Un cliente:"+"\n";
string s2 = " Nombre: " + this.Nombre + "\n";
string s3 = " Dirección: " + this.Direccion + "\n";
string s4 = " Teléfono: " + this.Telefono+ "\n";
return (s1+s2+s3+s4);
<?xml version="1.0"?>
<cliente
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<Nombre>Pepe</Nombre>
<Direccion>Casa de Pepe</Direccion>
<Telefono>123456789</Telefono>
</cliente>
[XmlRoot("Cliente")]
public class BuenCliente {
public string Telefono;
......
}
o bien homogeneizar las clases origen y destino:
[XmlRoot("cliente")]
public class BuenCliente {
public string Nombre;
......
}
[XmlRoot("cliente")]
public class BuenCliente {
public string Telefono;
......
}
- El mismo criterio se sigue para los demás elementos XML que se copian a la clase
destino: o coinciden en nombre con los campos de la clase o se especifica un
atributo XmlElement en la declaración de la clase:
[XmlRoot("cliente")]
public class Cliente {
public string Nombre;
public string Direccion;
public string Telefono;
......
}
[XmlRoot("cliente")]
public class BuenCliente {
[XmlElement("Telefono")]
public string Tfno;
public string Dir;
[XmlElement("Nombre")]
public string Nbre;
......
}
En este ejemplo sólo se deserializan los elementos Telefono y Nombre (del
documento XML) en los campos Tfno y Nbre (de la clase BuenCliente).
[XmlRoot("MiCliente", Namespace="http://rocco.ugr.es")]
public class Cliente
{
public string Nombre;
public string Direccion;
public string Telefono;
}
<?xml version="1.0"?>
<MiCliente
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://rocco.ugr.es">
<Nombre>Pepe</Nombre>
<Direccion>Casa de Pepe</Direccion>
<Telefono>123456789</Telefono>
</MiCliente>
[XmlRoot("MiCliente",
Namespace="http://rocco.ugr.es/Clis")]
public class Cliente {
public string Nombre;
[XmlElement(Namespace="http://elvex.ugr.es/Dirs")]
public TDireccion Direccion;
public string Telefono;
}
public class TDireccion {
public string Calle;
public int Numero;
public string Ciudad;
public string CP;
}
......
Cliente c = new Cliente();
c.Direccion = new TDireccion();
c.Nombre = "Pepe";
c.Direccion.Calle = "Calle Fina";
c.Direccion.Numero = 4;
c.Direccion.Ciudad = "Metrópolis";
c.Direccion.CP = "12345";
c.Telefono = "123456789";
<?xml version="1.0"?>
<MiCliente
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://rocco.ugr.es/Clis">
<Nombre>Pepe</Nombre>
<Direccion
xmlns="http://elvex.ugr.es/Dirs">
<Calle>Calle Fina</Calle>
<Numero>4</Numero>
<Ciudad>Metrópolis</Ciudad>
<CP>12345</CP>
</Direccion>
<Telefono>123456789</Telefono>
</MiCliente>
[XmlRoot("MiCliente",
Namespace="http://rocco.ugr.es/Clis")]
public class Cliente {
public string Nombre;
[XmlElement(Namespace="http://elvex.ugr.es/Dirs")]
public TDireccion Direccion;
[XmlAttribute]
public string Telefono;
}
public class TDireccion {
public string Calle;
public int Numero;
public string Ciudad;
[XmlAttribute]
public string CP;
}
<?xml version="1.0"?>
<MiCliente
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
Telefono="123456789"
<Telefono>
<string>123456789</string>
<string>987654321</string>
......
</Telefono>
[XmlArray("TelefonosContacto")]
[XmlArrayItem("NumTelefono")]
public string[] Telefono;
<TelefonosContacto>
<NumTelefono>123456789</NumTelefono>
<NumTelefono>987654321</NumTelefono>
......
</TelefonosContacto>