dr. diego lz. de ipiña gz. de artaza paginaspersonales.deusto.es/dipina (personal)

119
XML, Distribución y Componentes Tema 1 – Procesamiento XML en .NET http://paginaspersonales.deusto.es/dipina/MasterIS W/ Dr. Diego Lz. de Ipiña Gz. de Artaza http :// paginaspersonales.deusto.es / dipina (Personal) http :// www.morelab.deusto.es (Research Group) http :// www.smartlab.deusto.es (Research Lab) http://www.ctme.deusto.es (Cátedra de Telefónica Móviles) http://www.tecnologico.deusto.es (Tecnológico-Fundación Deusto)

Upload: oakes

Post on 10-Feb-2016

47 views

Category:

Documents


0 download

DESCRIPTION

XML, Distribución y Componentes Tema 1 – Procesamiento XML en .NET http://paginaspersonales.deusto.es/dipina/MasterISW/. Dr. Diego Lz. de Ipiña Gz. de Artaza http://paginaspersonales.deusto.es/dipina (Personal) http://www.morelab.deusto.es (Research Group) - PowerPoint PPT Presentation

TRANSCRIPT

Page 1: Dr. Diego Lz. de Ipiña Gz. de Artaza paginaspersonales.deusto.es/dipina  (Personal)

XML, Distribución y Componentes

Tema 1 – Procesamiento XML en .NEThttp://paginaspersonales.deusto.es/dipina/MasterISW/

Dr. Diego Lz. de Ipiña Gz. de Artazahttp://paginaspersonales.deusto.es/dipina (Personal)

http://www.morelab.deusto.es (Research Group)http://www.smartlab.deusto.es (Research Lab)

http://www.ctme.deusto.es (Cátedra de Telefónica Móviles)http://www.tecnologico.deusto.es (Tecnológico-Fundación Deusto)

Page 2: Dr. Diego Lz. de Ipiña Gz. de Artaza paginaspersonales.deusto.es/dipina  (Personal)

2/119

Temario

Procesamiento XML en .NET (21 y 22 Febrero) Estándar .NET [XML.NET] Soporte XML [XML-SAX, XML-DOM, Validación] XSL [XPath, XSLT, Scripts, Objetos de extensión]

Aplicaciones distribuidas (23 Febrero, 5 Marzo) XML/SOAP .NET Remoting Mensajería

Componentes .NET (6 y 7 Marzo) Metadatos y Reflexion Componentes .NET y Enterprise Services Complementos Interoperabilidad COM y P/Invoke COM+ y MTS MSMQ (colas de mensajes) Microsoft Communication Foundation (Indigo)

Page 3: Dr. Diego Lz. de Ipiña Gz. de Artaza paginaspersonales.deusto.es/dipina  (Personal)

3/119

Contenidos Parte XML

XML DTD Schema

XML Parsing SAX API DOM API

XSLT XSLT Scripts XSLT Object Extensions

Page 4: Dr. Diego Lz. de Ipiña Gz. de Artaza paginaspersonales.deusto.es/dipina  (Personal)

4/119

¿Qué es XML?

eXtensible Mark-up Language. Es un metalenguaje que permite diseñar otros lenguajes

(WML, MathML, XHTML,..). Cualquiera puede desarrollar su propio lenguaje de

etiquetas adecuado al tipo de aplicación que más le convenga.

En realidad hay muchas tecnologías basadas en XML (XPath, XLink, XPointer, XSL, ...).

XML 1.0 Specificationhttp://www.w3.org/TR/REC-xml

Page 5: Dr. Diego Lz. de Ipiña Gz. de Artaza paginaspersonales.deusto.es/dipina  (Personal)

5/119

HTML y XML

SGML (Standard Generalized Markup Language) HTML es una aplicación de SGML XML es subconjunto más fácil de usar de SGML XHTML es una aplicación de XML

Page 6: Dr. Diego Lz. de Ipiña Gz. de Artaza paginaspersonales.deusto.es/dipina  (Personal)

6/119

XML describe estructura y semántica

<?xml version=”1.0”><!DOCTYPE comedor SYSTEM “comedor.dtd”><comedor> <fabricante>Ipiña Altzariak</fabricante> <mesa tipo="redonda" madera="arce"> <precio>€400</precio> </mesa> <silla madera="arce"> <cantidad>2</cantidad> <calidad>excelente</calidad> <cojin incluido="sí"> <color>azul</color> </cojin> <precio>€200</precio> </silla></comedor>

Page 7: Dr. Diego Lz. de Ipiña Gz. de Artaza paginaspersonales.deusto.es/dipina  (Personal)

7/119

HTML describe formato

<html> <head><title>Comedor</title></head> <body> <h1>Comedor</h1> <p>Fabricante: Ipiña Altzariak</p> <ul> <li><b>Mesa redonda de madera de

arce</b></li> <li><b>Dos sillas de madera de arce</b>,

de excelente calidad, con un cojín azul cada una.</li>

<li><b>3 sillas de madera de roble</b>.</li> </ul> </body></html>

Page 8: Dr. Diego Lz. de Ipiña Gz. de Artaza paginaspersonales.deusto.es/dipina  (Personal)

8/119

Ventajas XML

Una de las mayores utilidades de XML es poder etiquetar los datos con su significado (self-describing data).

Permite la estructuración de la información. Ello lleva el tratamiento automático de la información a

límites insospechados. XML es la base de la nueva generación de aplicaciones

web intercambio de datos

Page 9: Dr. Diego Lz. de Ipiña Gz. de Artaza paginaspersonales.deusto.es/dipina  (Personal)

9/119

Usos XML

Sitios web Permite separar contenido y presentación

Comunicación <-> intercambio datos Servicios web

Como configuración de programas Deployment descriptos en servidores J2EE Ant make system

Page 10: Dr. Diego Lz. de Ipiña Gz. de Artaza paginaspersonales.deusto.es/dipina  (Personal)

10/119

Componentes documento XML

Los documentos XML constan de: Instrucciones de procesamiento (processing

instructions – PI) Declaraciones de tipo de documento Comentarios Elementos Referencias a entidades Secciones CDATA

Page 11: Dr. Diego Lz. de Ipiña Gz. de Artaza paginaspersonales.deusto.es/dipina  (Personal)

11/119

Instrucciones de procesamiento

Las PI son instrucciones para el procesador del documento XML.

Siempre hay al menos una PI, que pertenece al prólogo del documento:<?xml version="1.0"?><saludo>

Hola, mundo!</saludo>

Algunos navegadores interpretan la siguiente instrucción de procesamiento para indicar que el documento debería ser procesado mediante una hoja de estilo Guitars.xsl antes de ser visualizado:<?xml-stylesheet type="text/xsl" href="Guitars.xsl"?>

Page 12: Dr. Diego Lz. de Ipiña Gz. de Artaza paginaspersonales.deusto.es/dipina  (Personal)

12/119

Comentarios en XML

Los comentarios no se procesan. Tienen la siguiente sintaxis:

<!-- Esto es un comentario -->

Page 13: Dr. Diego Lz. de Ipiña Gz. de Artaza paginaspersonales.deusto.es/dipina  (Personal)

13/119

Elementos y atributos en XML

Los elementos son los que aportan estructura semántica al documento.

Se delimitan por etiquetas de apertura, cierre y etiquetas sin elementos interiores (etiquetas vacías).

Las etiquetas de apertura y las vacías suelen venir acompañadas de atributos, que parametrizan el elemento.

El valor de los atributos siempre se encierra entre comillas, dobles o simples.

<saludo tipo="coloquial">Hola</saludo>

Page 14: Dr. Diego Lz. de Ipiña Gz. de Artaza paginaspersonales.deusto.es/dipina  (Personal)

14/119

Elementos vs. Atributos

Demasiados atributos hacen que los documentos XML se puedan leer difícilmente.

No se puede indicar estructura de documento mediante atributos

<CUSTOMER LAST_NAME="Smith" FIRST_NAME="Sam" DATE="October 15, 2001" PURCHASE="Tomatoes" PRICE=“€1.25" NUMBER="8" />

Page 15: Dr. Diego Lz. de Ipiña Gz. de Artaza paginaspersonales.deusto.es/dipina  (Personal)

15/119

Elementos vs. Atributos (cont)

<CUSTOMER> <NAME> <LAST_NAME>Smith</LAST_NAME> <FIRST_NAME>Sam</FIRST_NAME> </NAME> <DATE>October 15, 2001</DATE> <ORDERS> <ITEM> <PRODUCT>Tomatoes</PRODUCT> <NUMBER>8</NUMBER> <PRICE>$1.25</PRICE> </ITEM> </ORDERS> </CUSTOMER>

Page 16: Dr. Diego Lz. de Ipiña Gz. de Artaza paginaspersonales.deusto.es/dipina  (Personal)

16/119

Referencias a entidades

Las referencias a entidades sirven para insertar un determinado contenido definido previamente.

<!ENTITY Empresa “Universidad de Deusto”><pie>Creado por &Empresa;</pie>

Page 17: Dr. Diego Lz. de Ipiña Gz. de Artaza paginaspersonales.deusto.es/dipina  (Personal)

17/119

Códigos de escape

Existen 5 referencias a entidades predefinidas: &amp; el carácter & &lt; el carácter < &gt; el carácter > &apos; el carácter ' &quot; el caracter "

Se incluyen los caracteres del juego ISO 10646. &#145; &#x2F31;

Page 18: Dr. Diego Lz. de Ipiña Gz. de Artaza paginaspersonales.deusto.es/dipina  (Personal)

18/119

Secciones CDATA

Las secciones CDATA (character data) contienen texto que no debe ser procesado.

Se tratan como una secuencia de caracteres sin estructura.

<![CDATA[<saludo>Hola, mundo!</saludo>]]>

Page 19: Dr. Diego Lz. de Ipiña Gz. de Artaza paginaspersonales.deusto.es/dipina  (Personal)

19/119

Gramáticas en XML

La gramática que restringe los elementos válidos dentro de un nuevo derivado de XML puede expresarse en forma de:DTD (Document Type Definitions) oEsquemas XML

Page 20: Dr. Diego Lz. de Ipiña Gz. de Artaza paginaspersonales.deusto.es/dipina  (Personal)

20/119

Document Type Definitions (DTDs)

Especifican la estructura y sintaxis de un documento XML

Labgroups.dtd

<!ELEMENT lab_group (student_name)*><!ELEMENT student_name (#PCDATA)> <!ATTLIST student_name dni ID #REQUIRED tutor IDREF #IMPLIED>

Page 21: Dr. Diego Lz. de Ipiña Gz. de Artaza paginaspersonales.deusto.es/dipina  (Personal)

21/119

Document Type Definitions (cont)

<?xml version="1.0"?><!DOCTYPE mensaje SYSTEM “labgroups.dtd">

<lab_group> <student_name dni=“44670523"> Josu Artaza </student_name> <student_name dni=“44543211"> Nuria Buruaga </student_name> <student_name dni=“23554521" tutor=“33456211"> Inga Dorsman </student_name> </lab_group>

Page 22: Dr. Diego Lz. de Ipiña Gz. de Artaza paginaspersonales.deusto.es/dipina  (Personal)

22/119

XML Schemas

Los DTD no son muy potentes para definir gramáticas.

Otra forma de hacerlo es con Esquemas XML basados en el propio XML y que soporta más tipos de datos.

Page 23: Dr. Diego Lz. de Ipiña Gz. de Artaza paginaspersonales.deusto.es/dipina  (Personal)

23/119

Ejemplo Schema

DTD :<!ELEMENT text (#PCDATA | emph | name)*> <!ATTLIST text timestamp NMTOKEN #REQUIRED>

XML Schema:<xsd:element name="text"> <xsd:complexType mixed="true"> <xsd:sequence> <xsd:element ref="emph"/> <xsd:element ref="name"/> </xsd:sequence> <xsd:attribute name="timestamp" type="xsd:date"

use="required"/> </xsd:complexType> </xsd:element>

Page 24: Dr. Diego Lz. de Ipiña Gz. de Artaza paginaspersonales.deusto.es/dipina  (Personal)

24/119

Ejemplo Schema (cont)

XML Document:

<?xml version="1.0"?><text timestamp="08:45:00.000">The deadline of <name>Distributed.NET assigment</name> is <emph>December 22nd 2005</emph>.

</text>

Page 25: Dr. Diego Lz. de Ipiña Gz. de Artaza paginaspersonales.deusto.es/dipina  (Personal)

25/119

What is an XML Schema?

Extraído de: http://www.w3schools.com/schema/default.asp

The purpose of an XML Schema is to define the legal building blocks of an XML document, just like a DTD.

An XML Schema: defines elements that can appear in a document defines attributes that can appear in a document defines which elements are child elements defines the order of child elements defines the number of child elements defines whether an element is empty or can include text defines data types for elements and attributes defines default and fixed values for elements and attributes

Page 26: Dr. Diego Lz. de Ipiña Gz. de Artaza paginaspersonales.deusto.es/dipina  (Personal)

26/119

XML Schemas are the Successors of DTDs

We think that very soon XML Schemas will be used in most Web applications as a replacement for DTDs. Here are some reasons: XML Schemas are extensible to future additions XML Schemas are richer and more powerful than DTDs XML Schemas are written in XML XML Schemas support data types XML Schemas support namespaces

Page 27: Dr. Diego Lz. de Ipiña Gz. de Artaza paginaspersonales.deusto.es/dipina  (Personal)

27/119

Ejemplo XML y DTD

Ejemplo XML:<?xml version="1.0"?><!DOCTYPE note SYSTEM "http://www.w3schools.com/dtd/note.dtd">

<note> <to>Tove</to> <from>Jani</from> <heading>Reminder</heading> <body>Don't forget me this weekend!</body></note>

Ejemplo DTD:<!ELEMENT note (to, from, heading, body)><!ELEMENT to (#PCDATA)><!ELEMENT from (#PCDATA)><!ELEMENT heading (#PCDATA)><!ELEMENT body (#PCDATA)>

Page 28: Dr. Diego Lz. de Ipiña Gz. de Artaza paginaspersonales.deusto.es/dipina  (Personal)

28/119

Ejemplo XML y Schema Ejemplo XML:

<?xml version="1.0"?><note xmlns="http://www.w3schools.com"

xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.w3schools.com note.xsd">

<to>Tove</to> <from>Jani</from> <heading>Reminder</heading> <body>Don't forget me this weekend!</body></note>

Ejemplo DTD:<?xml version="1.0"?><xs:schema xmlns:xs=http://www.w3.org/2001/XMLSchema

targetNamespace=http://www.w3schools.com xmlns=http://www.w3schools.com elementFormDefault="qualified">

<xs:element name="note"> <xs:complexType> <xs:sequence>

<xs:element name="to" type="xs:string"/><xs:element name="from" type="xs:string"/><xs:element name="heading" type="xs:string"/><xs:element name="body" type="xs:string"/>

</xs:sequence> </xs:complexType></xs:element></xs:schema>

Page 29: Dr. Diego Lz. de Ipiña Gz. de Artaza paginaspersonales.deusto.es/dipina  (Personal)

29/119

Elementos Simples

<xs:element name="xxx" type="yyy"/> donde xxx es el nombre del elemento e yyy el tipo, siendo

los más comunes: xs:string xs:decimal xs:integer xs:boolean xs:date xs:time

Ejemplos:<lastname>Refsnes</lastname> <age>36</age> <dateborn>1970-03-27</dateborn>

Page 30: Dr. Diego Lz. de Ipiña Gz. de Artaza paginaspersonales.deusto.es/dipina  (Personal)

30/119

Atributos y Restricciones en Elementos

Ejemplo atributos:<lastname lang="EN">Smith</lastname><xs:attribute name="lang" type="xs:string"/>

Ejemplo restricciones sobre un elemento:<xs:element name="letter"> <xs:simpleType> <xs:restriction base="xs:string"> <xs:pattern value="[a-z]"/> </xs:restriction> </xs:simpleType></xs:element>

Page 31: Dr. Diego Lz. de Ipiña Gz. de Artaza paginaspersonales.deusto.es/dipina  (Personal)

31/119

XML bien formado y/o XML válido

Hay dos tipos de documentos XML:Bien formados: son aquellos que cumplen las

reglas sintácticas de XMLVálidos: son aquellos que, además de ser bien

formados, siguen las reglas de una gramática (definida en un DTD o XML Schema)

Page 32: Dr. Diego Lz. de Ipiña Gz. de Artaza paginaspersonales.deusto.es/dipina  (Personal)

32/119

Reglas para que un documento esté bien formado

Para que un documento esté bien formado:Debe tener un prólogoDebe tener una etiqueta raízLas etiquetas se hallan correctamente

anidadasSe usan caracteres válidos y bien aplicadosLos valores de los atributos vienen encerrados

entre comillas ...

Page 33: Dr. Diego Lz. de Ipiña Gz. de Artaza paginaspersonales.deusto.es/dipina  (Personal)

33/119

Reglas para que un documento sea válido

Para que un documento sea válido debe declarar el DTD o XML Schema contra el cual debe validarse.

Se hace mediante DOCTYPE, pudiendo ser los DTD públicos o de sistema.

<!DOCTYPE saludo SYSTEM “saludo.dtd”><!DOCTYPE saludo PUBLIC “-//Saludos//DTD Lenguaje de saludos//ES” “http://www.deusto.es/dtds/saludo.dtd”>

También se puede insertar el DTD entero en ese punto, en lugar de referenciar al fichero.

Page 34: Dr. Diego Lz. de Ipiña Gz. de Artaza paginaspersonales.deusto.es/dipina  (Personal)

34/119

Proceso de validación documento XML

¿WellFormed?

DocumentoXML

DTD Error: DocumentoXML no válido

Error: DocumentoXML mal formado

Procesamiento dela información

¿Valid?

¿DTD?

(opcional) si

no

si

si

no

no

Page 35: Dr. Diego Lz. de Ipiña Gz. de Artaza paginaspersonales.deusto.es/dipina  (Personal)

35/119

XML Namespaces

El estándar XML también define los espacios de nombres (XML Namespaces).

Permiten que un mismo documento XML tenga etiquetas de diferentes lenguajes (definidas en diferentes gramáticas DTD).

Así es posible mezclar más información en los documentos, por ejemplo, añadir información semántica a un documento XHTML.

Page 36: Dr. Diego Lz. de Ipiña Gz. de Artaza paginaspersonales.deusto.es/dipina  (Personal)

36/119

Ejemplo XML Namespaces

<?xml version="1.0"?><!DOCTYPE mensaje SYSTEM "mensaje.dtd">

<mensaje><remite><dir:direccion xmlns:dir=“http://www.deusto.es/direccion”><dir:calle>Avda. Universidades</dir:calle><dir:localidad cp=“40007”>Bilbao</dir:localidad></dir:direccion><nombre>Diego Ipiña</nombre><email>[email protected]</email></remite><!-- Resto del mensaje XML... -->

</mensaje>

Page 37: Dr. Diego Lz. de Ipiña Gz. de Artaza paginaspersonales.deusto.es/dipina  (Personal)

37/119

Lenguajes basados en XML

Chemical Markup Language (CML) Mathematical Markup Language (MathML) Channel Definition Format (CDF) Synchronized Multimedia Integration Language (SMIL) XHTML Scalable Vector Graphics (SVG) SOAP y WSDL VoiceML Wireless Markup Language (WML) RSS (Rich Site Summary)

Page 38: Dr. Diego Lz. de Ipiña Gz. de Artaza paginaspersonales.deusto.es/dipina  (Personal)

38/119

Herramientas de XML

Editores http://www.xmlcooktop.com/ gratis XML Spy, www.xmlspy.com

XML parsers Lee un documento XML Verifica que XML está bien formado Verifican que XML es válido

expat, parser written in C by James Clark (www.jclark.com) Lark, written in Java (www.textuality.com/Lark/) Apache Jakarta Xerces (www.apache.org) .NET FCL System.Xml

XML Validators Verifican que XML es válido

XML.com's Validator based on Lark (xml.com)

Page 39: Dr. Diego Lz. de Ipiña Gz. de Artaza paginaspersonales.deusto.es/dipina  (Personal)

39/119

¿Por qué usar XML?

Un documento XML puede ser fácilmente procesado y sus datos manipulados

Existen APIs para procesar esos documentos en Java, C, C#, C++, Perl.. (y por supuesto Python)

XML define datos portables al igual que Java define código portable

Page 40: Dr. Diego Lz. de Ipiña Gz. de Artaza paginaspersonales.deusto.es/dipina  (Personal)

40/119

XML Parsing

DocumentoXML

XML DTDXML Schema

Parser XML AplicaciónXML

Page 41: Dr. Diego Lz. de Ipiña Gz. de Artaza paginaspersonales.deusto.es/dipina  (Personal)

41/119

XML Parsing (cont)

SAX Define interfaz dirigido por eventos (event-driven) para el

procesamiento de un documento XML Definido por David Megginson y lista correo XML-DEV :

http://www.megginson.com/SAX

DOM Provee una representación de un documento XML en forma de un

árbol Carga todo el documento XML en memoria http://www.w3.org/DOM

Page 42: Dr. Diego Lz. de Ipiña Gz. de Artaza paginaspersonales.deusto.es/dipina  (Personal)

42/119

XML en .NET

El espacio de nombres System.Xml ofrece una variedad de clases para leer y escribir documentos XML: La clase XmlDocument implementa DOM Para un procesamiento orientado al stream se puede

usar XmlTextReader o XmlValidatingReader XmlTextWriter simplifica el proceso de creación de

documentos XML.

Page 43: Dr. Diego Lz. de Ipiña Gz. de Artaza paginaspersonales.deusto.es/dipina  (Personal)

43/119

System.XML

Este espacio de nombres comprende todas las clases necesarias para manejar documentos XML.

Permite leer o parsear un documento, así como escribir un documento XML.

Para ello necesitaremos conocer previamente la estructura de un documento XML.

Page 44: Dr. Diego Lz. de Ipiña Gz. de Artaza paginaspersonales.deusto.es/dipina  (Personal)

44/119

System.XML

Este espacio de nombres provee soporte para los estándares de procesamiento XML: XML 1.0 - http://www.w3.org/TR/1998/REC-xml-19980210 -

including DTD support. XML Namespaces - http://www.w3.org/TR/REC-xml-names/ - both

stream level and DOM. XSD Schemas - http://www.w3.org/2001/XMLSchema XPath expressions - http://www.w3.org/TR/xpath XSLT transformations - http://www.w3.org/TR/xslt DOM Level 1 Core - http://www.w3.org/TR/REC-DOM-Level-1/ DOM Level 2 Core - http://www.w3.org/TR/DOM-Level-2/

Page 45: Dr. Diego Lz. de Ipiña Gz. de Artaza paginaspersonales.deusto.es/dipina  (Personal)

45/119

Un poco de XML

Lenguaje mundial de facto para intercambio de datos

XML no tiene tanto éxito porque es un gran lenguaje, sino porque las herramientas disponibles para leer, escribir y manipular XML son muy comunes

Casi todos los parseadores de XML implementan una de dos APIs: DOM: lee un documento en memoria y lo carga en un

árbol SAX: API basada en eventos

Page 46: Dr. Diego Lz. de Ipiña Gz. de Artaza paginaspersonales.deusto.es/dipina  (Personal)

46/119

Ejemplo DOM en .NET

<?xml version=“1.0”?><Guitars> <Guitar Image=“MySG.jpeg”> <Make>Gibson</Make> <Model>SG</Model> <Year>1977</Year> <Color>Tobacco Sunburst</Color> <Neck>Rosewood</Neck> </Guitar> <Guitar Image=“MyStrat.jpeg”> <Make>Fender</Make> <Model>Stratocaster</Model> <Year>1990</Year> <Color>Black</Color> <Neck>Maple</Neck> </Guitar></Guitars>

Page 47: Dr. Diego Lz. de Ipiña Gz. de Artaza paginaspersonales.deusto.es/dipina  (Personal)

47/119

Ejemplo DOM en .NET

using System;using System.Xml;

class MyApp{ static void Main () { XmlDocument doc = new XmlDocument (); doc.Load ("Guitars.xml"); XmlNodeList nodes = doc.GetElementsByTagName

("Guitar"); foreach (XmlNode node in nodes) { Console.WriteLine ("{0} {1}",

node["Make"].InnerText, node["Model"].InnerText); } }}

Page 48: Dr. Diego Lz. de Ipiña Gz. de Artaza paginaspersonales.deusto.es/dipina  (Personal)

48/119

XmlDocument

Interfaz programática para documentos XML que conforman con la especificación DOM

Método Load(nombre-doc) procesa el documento y construye un árbol del mismo

Una llamada exitosa es normalmente seguida de invocación a propiedad DocumentElement Para saber si tiene hijos usar propiedad HasChildNodes

Propiedad ChildNodes devuelve los hijos de un nodo Todo hijo es un XMLNode que puede ser del tipo Element, Text, Attribute, etc.

Page 49: Dr. Diego Lz. de Ipiña Gz. de Artaza paginaspersonales.deusto.es/dipina  (Personal)

49/119

XmlTextReader

Frente al estándar SAX, .NET ofrece XmlTextReader

Está basado en streams como SAX y es por tanto más eficiente con el uso de memoria que DOM

Usa un mecanismo pull para examinar XML en vez de push como SAX

Page 50: Dr. Diego Lz. de Ipiña Gz. de Artaza paginaspersonales.deusto.es/dipina  (Personal)

50/119

Ejemplo XmlTextReader I

Lee un fichero XML y visualiza todos sus nodos

<?xml version="1.0"?><!-- This is a sample XML document --><!DOCTYPE Items [<!ENTITY number "123">]><Items> <Item>Test with an entity: &number;</Item> <Item>test with a child element <more/> stuff</Item> <Item>test with a CDATA section <![CDATA[<456>]]>

def</Item> <Item>Test with an char entity: &#65;</Item> <!-- Fourteen chars in this element.--> <Item>1234567890ABCD</Item></Items>

Page 51: Dr. Diego Lz. de Ipiña Gz. de Artaza paginaspersonales.deusto.es/dipina  (Personal)

51/119

Ejemplo XmlTextReader II

public class Sample { private const String filename = "items.xml"; public static void Main() { XmlTextReader reader = null; try { // Cargar reader con fichero XML ignorando espacios. reader = new XmlTextReader(filename); reader.WhitespaceHandling = WhitespaceHandling.None; // Procesar fichero y visualizar cada nodo while (reader.Read()) { switch (reader.NodeType) { case XmlNodeType.Element: Console.Write("<{0}>", reader.Name); break; case XmlNodeType.Text: Console.Write(reader.Value); break; case XmlNodeType.CDATA: Console.Write("<![CDATA[{0}]]>", reader.Value); break;

Page 52: Dr. Diego Lz. de Ipiña Gz. de Artaza paginaspersonales.deusto.es/dipina  (Personal)

52/119

Ejemplo XmlTextReader III

case XmlNodeType.ProcessingInstruction: Console.Write("<?{0} {1}?>", reader.Name,

reader.Value); break; case XmlNodeType.Comment: Console.Write("<!--{0}-->", reader.Value); break; case XmlNodeType.XmlDeclaration: Console.Write("<?xml version='1.0'?>"); break; case XmlNodeType.Document: break; case XmlNodeType.DocumentType: Console.Write("<!DOCTYPE {0} [{1}]",

reader.Name, reader.Value); break;

Page 53: Dr. Diego Lz. de Ipiña Gz. de Artaza paginaspersonales.deusto.es/dipina  (Personal)

53/119

Ejemplo XmlTextReader IV

case XmlNodeType.EntityReference: Console.Write(reader.Name); break; case XmlNodeType.EndElement: Console.Write("</{0}>", reader.Name); break; } } } finally { if (reader!=null) reader.Close(); } }} // Final clase

Page 54: Dr. Diego Lz. de Ipiña Gz. de Artaza paginaspersonales.deusto.es/dipina  (Personal)

54/119

Transformaciones XSLT

XSLT (Extensible Stylesheet Language Transformations) es un lenguaje para convertir documentos XML de un formato en otro

Tiene dos usos principales: Convertir documentos XML en HTML Convertir documentos XML en otros documentos XML

Este tipo de conversiones son el núcleo de aplicaciones middleware como Microsoft BizTalk Server.

Page 55: Dr. Diego Lz. de Ipiña Gz. de Artaza paginaspersonales.deusto.es/dipina  (Personal)

55/119

Ejemplo transformación XSLT

using System;using System.Xml;using System.Xml.XPath;using System.Xml.Xsl;class MyApp { static void Main (string[] args) {

if (args.Length < 2) { Console.WriteLine ("Syntax: TRANSFORM xmldoc

xsldoc"); return; } try { XslCompiledTransform xsl = new

XslCompiledTransform (); xsl.Load (args[1]);

Page 56: Dr. Diego Lz. de Ipiña Gz. de Artaza paginaspersonales.deusto.es/dipina  (Personal)

56/119

Ejemplo transformación XSLT

//Crear un nuevo XPathDocument y cargar el fichero XML a transformar

XPathDocument doc = new XPathDocument (args[0]);

//Crear un XmlTextWriter que escribe a consola.

XmlWriter writer = new XmlTextWriter(Console.Out);

xsl.Transform (doc, null, writer, null); } catch (Exception ex) { Console.WriteLine (ex.Message); }

}}

Page 57: Dr. Diego Lz. de Ipiña Gz. de Artaza paginaspersonales.deusto.es/dipina  (Personal)

57/119

W3C Document Object Model (DOM)

Documentos XML son tratados como un árbol de nodos

Cada elemento es un “nodo” Los elementos hijos y el texto contenido dentro

de un elemento son subnodos W3C DOM Site: http://www.w3.org/DOM/ DOM Java Language Binding:

http://www.w3.org/TR/DOM-Level-2-Core/java-binding.html

Page 58: Dr. Diego Lz. de Ipiña Gz. de Artaza paginaspersonales.deusto.es/dipina  (Personal)

58/119

Características DOM

Documento que se carga totalmente en memoria en una estructura de árbol

Ventaja: fácil acceder a datos en función de la jerarquía de elementos, así como modificar el contenido de los documentos e incluso crearlos desde cero.

Desventaja: coste en tiempo y memoria que conlleva construir el árbol

Page 59: Dr. Diego Lz. de Ipiña Gz. de Artaza paginaspersonales.deusto.es/dipina  (Personal)

59/119

W3C XML DOM Objects

Element – un elemento XML Attribute – un attributo Text – texto contenido en un elemento o atributo CDATAsection – sección CDATA EntityReference – Referencia a una entidad Entity – Indicación de una entidad XML ProcessingInstruction – Una instrucción de

procesamiento Comment – Contenido de un comentario de XML Document – El objeto documento DocumentType – Referencia al elemento DOCTYPE DocumentFragment – Referencia a fragmento de

documento Notation – Contenedor de una anotación

Page 60: Dr. Diego Lz. de Ipiña Gz. de Artaza paginaspersonales.deusto.es/dipina  (Personal)

60/119

DOM

<?xml version="1.0"?><Guitars> <Guitar Image="MySG.jpeg"> <Make>Gibson</Make> <Model>SG</Model> <Year>1977</Year> <Color>Tobacco Sunburst</Color> <Neck>Rosewood</Neck> </Guitar></Guitars>

Page 61: Dr. Diego Lz. de Ipiña Gz. de Artaza paginaspersonales.deusto.es/dipina  (Personal)

61/119

Árbol DOM

Page 62: Dr. Diego Lz. de Ipiña Gz. de Artaza paginaspersonales.deusto.es/dipina  (Personal)

62/119

XMLDocument I

La clase XMLDocument es compatible con la especificación DOM Level 2 Core Representa a un documento como un árbol de nodos que tiene por raíz el

elemento raíz del documento XML. Cada nodo es una instancia de XmlNode, que expone métodos y propiedades

para navegar árboles DOM, leer y escribir contenido de nodos, añadir y borrar nodos, etc.

Un ejemplo sencillo de su uso sería:XmlDocument doc = new XmlDocument ();doc.Load ("Guitars.xml");

El atributo DocumentElement devuelve un XmlNode que hace referencia a la raíz del documento, que es el punto de comienzo al navegar de arriba a abajo el árbol DOM

La combinación de los atributos HasChildNodes y ChildNodes hace posible un enfoque recursivo para iterar sobre los nodos de un árbol

La invocación a ChildNodes no devuelve atributos XML, sin embargo, su propiedad Attributes lo hace.

Las propiedades NodeType, Name, y Value de un XmlNode exponen su tipo, nombre, y valor del correspondiente nodo En atributos usa la propiedad LocalName para devolver nombres sin prefijos.

Page 63: Dr. Diego Lz. de Ipiña Gz. de Artaza paginaspersonales.deusto.es/dipina  (Personal)

63/119

XMLDocument II

Para acceder a nodos particulares puedes hacer uso de las propiedades de un XmlDocument GetElementsByTagName, SelectNodes, y SelectSingleNode

XmlDocument puede también utilizarse para escribir documentos XML

La clase XmlDataDocument ofrece un mecanismo para tratar datos relacionales como datos XML. Puedes crear un XmlDataDocument alrededor de un DataSet del siguiente modo:DataSet ds = new DataSet ();// TODO: Initialize the DataSet with a database query

XmlDataDocument doc = new XmlDataDocument (ds);

Page 64: Dr. Diego Lz. de Ipiña Gz. de Artaza paginaspersonales.deusto.es/dipina  (Personal)

64/119

Ejemplo XmlDocument I

using System;using System.Xml;class MyApp{ static void Main () { XmlDocument doc = new XmlDocument (); doc.Load ("Guitars.xml"); XmlNodeList nodes = doc.GetElementsByTagName ("Guitar"); foreach (XmlNode node in nodes) { Console.WriteLine ("{0} {1}",

node["Make"].InnerText, node["Model"].InnerText); }

// Visualiza el contenido de todo el árbolOutputNode (doc.DocumentElement);

}

Page 65: Dr. Diego Lz. de Ipiña Gz. de Artaza paginaspersonales.deusto.es/dipina  (Personal)

65/119

Ejemplo XmlDocument IIpublic static void OutputNode (XmlNode node){Console.WriteLine ("Type={0}\tName={1}\tValue={2}",node.NodeType, node.Name, node.Value);

if (node.Attributes != null) {foreach (XmlAttribute attr in node.Attributes)Console.WriteLine("Type={0}\tName={1}\tValue={2}",attr.NodeType, attr.Name, attr.Value);}

if (node.HasChildNodes) {XmlNodeList children = node.ChildNodes;foreach (XmlNode child in children)OutputNode (child);}}

}

Page 66: Dr. Diego Lz. de Ipiña Gz. de Artaza paginaspersonales.deusto.es/dipina  (Personal)

66/119

XmlTextReader

La clase System.Xml.XmlTextReader ofrece una interfaz rápida, hacia adelante, de sólo lectura de documentos XML.

XmlValidatingReader permite efectuar una validación de un documento XML Es orientada al stream como SAX Es más eficiente en consumo de memoria que XmlDocument,

XmlTextReader reader = null;...reader = new XmlTextReader ("Guitars.xml");reader.WhitespaceHandling = WhitespaceHandling.None;while (reader.Read ()) { Console.WriteLine ("Type={0}\tName={1}\tValue={2}", reader.NodeType,

reader.Name, reader.Value); if (reader.AttributeCount > 0) { while (reader.MoveToNextAttribute())

{ Console.WriteLine ("Type={0}\tName={1}\tValue={2}",

reader.NodeType, reader.Name, reader.Value); } }

}}

Page 67: Dr. Diego Lz. de Ipiña Gz. de Artaza paginaspersonales.deusto.es/dipina  (Personal)

67/119

XmlTextWriter

La clase XmlTextWriter se puede utilizar para generar documentos Xml desde cero.

XmlTextWriter writer = null;...writer = new XmlTextWriter ("Guitars.xml",

System.Text.Encoding.Unicode);writer.Formatting = Formatting.Indented;

writer.WriteStartDocument ();writer.WriteStartElement ("Guitars");writer.WriteStartElement ("Guitar");writer.WriteAttributeString ("Image", "MySG.jpeg");writer.WriteElementString ("Make", "Gibson");writer.WriteElementString ("Model", "SG");writer.WriteElementString ("Year", "1977");writer.WriteElementString ("Color", "Tobacco Sunburst");writer.WriteElementString ("Neck", "Rosewood");writer.WriteEndElement ();writer.WriteEndElement ();

Page 68: Dr. Diego Lz. de Ipiña Gz. de Artaza paginaspersonales.deusto.es/dipina  (Personal)

68/119

XPath XPath o XML Path Language, es un lenguaje para acceder a partes de un

documento XML XPath puede ser considerado con el equivalente XML de SQL El espacio de nombres System.Xml.XPath define un conjunto de clases que

permiten su uso Algunos ejemplos de location path son:

Todos los elementos Guitar que son hijos de Guitars: /Guitars/Guitar Todos los atributos (no elementos) de nombre Image que pertenecen a elementos

Guitar: /Guitars/Guitar/@Image Todos los elementos Guitar en el documento: //Guitar Todos los elementos hijo de Guitars: /Guitars/* Todos los atributos que pertenecen a elementos Guitar en el documento:

//Guitar/@* Elementos Guitar que tienen atributo Image: //Guitar[@Image] Todos los elementos Guitar que tienen atributo Image con valor

“MyStrat.jpeg”: //Guitar[@Image = "MyStrat.jpeg"] Guitarras manufacturadas después de 1980 por Fender: //Guitar[Year > 1980]

[Make = "Fender"] o //Guitar[Year > 1980 and Make = "Fender"]

Page 69: Dr. Diego Lz. de Ipiña Gz. de Artaza paginaspersonales.deusto.es/dipina  (Personal)

69/119

System.Xml.XPath

Las clases principales de este espacio de nombres son: XPathDocument, representa documentos XML que quieren ser

consultados mediante XPath XPathNavigator, provee un mecanismo para ejecutar consultas XPath; XPathNodeIterator, que representa conjuntos de nodos generados por

consultas XPath y permite iterar sobre ellos XPathNavigator provee 5 métodos para ejecutar consultas XPath.

Los más importantes son: Evaluate ejecuta cualquier expresión XPath, devolviendo un Object que puede

ser un string, un float, un boolean o un XPathNodeIterator Select trabaja exclusivamente con expresiones que devuelven conjuntos de

nodos y es un vehículo ideal para evaluar location paths. Siempre devuelve un XPathNodeIterator

XPathNodeIterator es una clase simple que puedes utilizar para iterar por los elementos devueltos en un node set. La propiedad Count devuelve cuántos nodos han sido devueltos: Console.WriteLine ("Select returned {0} nodes",

iterator.Count); El método MoveNext te permite iterar por el conjunto de nodos. Mientras

iteras, la propiedad Current expone un objeto XPathNavigator que representa el nodo actual.

Page 70: Dr. Diego Lz. de Ipiña Gz. de Artaza paginaspersonales.deusto.es/dipina  (Personal)

70/119

Ejemplo XPathusing System;using System.Xml.XPath;class MyApp{

static void Main (){XPathDocument doc = new XPathDocument ("Guitars.xml");XPathNavigator nav = doc.CreateNavigator ();XPathNodeIterator iterator = nav.Select ("/Guitars/Guitar");

while (iterator.MoveNext ()) {XPathNodeIterator it = iterator.Current.Select ("Make");it.MoveNext ();string make = it.Current.Value;

it = iterator.Current.Select ("Model");it.MoveNext ();string model = it.Current.Value;

Console.WriteLine ("{0} {1}", make, model);}}

}

Page 71: Dr. Diego Lz. de Ipiña Gz. de Artaza paginaspersonales.deusto.es/dipina  (Personal)

71/119

Extensible Style Language Transformations (XSLT) I

Con la diversidad de lenguajes de presentación que hay (WML, HTML, cHTML) existen dos alternativas para desarrollar las aplicaciones: Desarrollar versiones de los procesos de generación

de presentación (JSP, ASP, CGI,..) para cada lenguaje.

Desarrollar solo una versión que genere XML y conversores de XML a los lenguajes de presentación.

Page 72: Dr. Diego Lz. de Ipiña Gz. de Artaza paginaspersonales.deusto.es/dipina  (Personal)

72/119

Extensible Style Language Transformations (XSLT) II

Dos partes: Transformation Language (XSLT) Formatting Language (XSL Formatting Objects)

XSLT transforma un documento XML en otro documento XML

XSLFO formatea y estiliza documentos en varios modos XSLT W3C Recommendation - http://www.w3.org/TR/xslt

Page 73: Dr. Diego Lz. de Ipiña Gz. de Artaza paginaspersonales.deusto.es/dipina  (Personal)

73/119

Operaciones entre árboles en XSL

Page 74: Dr. Diego Lz. de Ipiña Gz. de Artaza paginaspersonales.deusto.es/dipina  (Personal)

74/119

Ventajas y desventajas de XSLT

Ventajas: No asume un único formato de salida de documentos Permite manipular de muy diversas maneras un documento XML:

reordenar elementos, filtrar, añadir, borrar, etc. Permite acceder a todo el documento XML XSLT es un lenguaje XML

Desventajas: Su utilización es más compleja que un lenguaje de programación

convencional Consume cierta memoria y capacidad de proceso DOM detrás

Page 75: Dr. Diego Lz. de Ipiña Gz. de Artaza paginaspersonales.deusto.es/dipina  (Personal)

75/119

Usando hojas de estilo XSLT

Para crear una transformación XSL necesitamos: El documento XML a transformar (students.xml) La hoja de estilo que especifica la transformación

(students.xsl)

Page 76: Dr. Diego Lz. de Ipiña Gz. de Artaza paginaspersonales.deusto.es/dipina  (Personal)

76/119

Documento XML (students.xml)

<?xml version="1.0"?> <?xml-stylesheet type="text/xsl" href=“students.xsl"?><course> <name id="csci_2962">Programming XML in Java</name> <teacher id=“di">Diego Ipiña</teacher> <student id=“ua"> <name>Usue Artaza</name> <hw1>30</hw1> <hw2>70</hw2> <project>80</project> <final>85</final> </student> <student id=“iu"> <name>Iñigo Urrutia</name> <hw1>80</hw1> <hw2>90</hw2> <project>100</project> <final>40</final> </student> </course>

Page 77: Dr. Diego Lz. de Ipiña Gz. de Artaza paginaspersonales.deusto.es/dipina  (Personal)

77/119

Hoja de estilo XSLT (students.xsl)

<?xml version="1.0"?> <xsl:stylesheet version="1.0“

xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:template match="course"> <HTML> <HEAD><TITLE>Name of students</TITLE></HEAD> <BODY> <xsl:apply-templates select="student"/> </BODY> </HTML> </xsl:template> <xsl:template match="student"> <P><xsl:value-of select="name"/></P> </xsl:template> </xsl:stylesheet>

Page 78: Dr. Diego Lz. de Ipiña Gz. de Artaza paginaspersonales.deusto.es/dipina  (Personal)

78/119

Resultado de transformación

(students.html)

<HTML> <HEAD> <TITLE>Name of students</TITLE> </HEAD>

<BODY> <P>Usue Artaza</P> <P>Iñigo Urrutia</P> </BODY> </HTML>

Page 79: Dr. Diego Lz. de Ipiña Gz. de Artaza paginaspersonales.deusto.es/dipina  (Personal)

79/119

Formas de uso de XSLT

Visualizar directamente en un navegador el documento XML que tiene asociada una hoja XSLT.

Ejecutar el procesador XSLT independientemente del navegador. Se le pasan las entradas necesarias (fichero origen y hoja XSLT a utilizar) y genera la salida en un fichero, con el que podemos hacer lo que queramos.

Realizar las transformaciones dentro de un programa en el servidor y enviar a los clientes sólo el resultado de la transformación.

Page 80: Dr. Diego Lz. de Ipiña Gz. de Artaza paginaspersonales.deusto.es/dipina  (Personal)

80/119

Aplicaciones usando XSLT

InternetJSP

Clases Java

Base de Datos

Cliente ServidorXML

Arquitectura en 5 capas dónde el servidor contiene conversores XSLT para generar presentación en distintos formatos.

XSLT

Page 81: Dr. Diego Lz. de Ipiña Gz. de Artaza paginaspersonales.deusto.es/dipina  (Personal)

81/119

XSLT son documentos XML bien formados

xsl:stylesheet – elemento raíz xsl:template – cómo transformar un nodo

seleccionado Se asocia con un fragmento del documento a través de una

expresión en XPath Transforma XML entrante en otro fragmento de XML match – Atributo para seleccionar nodo

"/" – nodo raiz del documento de entrada Elemento xsl:apply-templates. Aplica los templates

definidos para los hijos de un nodo seleccionado

Page 82: Dr. Diego Lz. de Ipiña Gz. de Artaza paginaspersonales.deusto.es/dipina  (Personal)

82/119

Ejemplo XSLT

<?xml version="1.0"?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

<xsl:template match="/"> <xsl:apply-templates/> </xsl:template> </xsl:stylesheet>

Page 83: Dr. Diego Lz. de Ipiña Gz. de Artaza paginaspersonales.deusto.es/dipina  (Personal)

83/119

Elementos XSLT

xsl:value-of permite recuperar el valor de un nodo Los nodos son seleccionados usando la sintaxis de la

especificación XPath XML Sólo selecciona el valor del primer estudiante que

encuentre<xsl:template match=“course"> <xsl:value-of select=“student"/>

</xsl:template>

Page 84: Dr. Diego Lz. de Ipiña Gz. de Artaza paginaspersonales.deusto.es/dipina  (Personal)

84/119

Elementos XSLT Si queremos seleccionar varios podemos hacer:

<xsl:template match=“course"> <xsl:apply-templates select=“student"/>

</xsl:template> <xsl:template match=“student"> <xsl:value-of select="."/>

</xsl:template>

O usar xsl:for-each<xsl:template match=“course"> <xsl:for-each select=“student">

<xsl:value-of select="."/> </xsl:for-each>

</xsl:template>

Page 85: Dr. Diego Lz. de Ipiña Gz. de Artaza paginaspersonales.deusto.es/dipina  (Personal)

85/119

Elementos XSLT (cont)

Para realizar distintos procesamientos en función de los datos se usa xsl:choose: Se compone de elementos xsl:when Un elemento opcional xsl:otherwise

Para procesar o no un elemento en función de una condición se usa xsl:if: Condición en atributo test

Page 86: Dr. Diego Lz. de Ipiña Gz. de Artaza paginaspersonales.deusto.es/dipina  (Personal)

86/119

Ejemplo

<?xml version="1.0"?> <xsl:stylesheet version="1.0"

xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:template match="/"> <HTML> <HEAD> <TITLE>Name of students</TITLE> </HEAD> <BODY> <xsl:apply-templates/> </BODY> </HTML> </xsl:template> <xsl:template match="course"> <xsl:apply-templates select="student"/> </xsl:template> <xsl:template match="student"> <xsl:for-each select="name"><P><xsl:value-of

select="."/></P></xsl:for-each> </xsl:template> </xsl:stylesheet>

Page 87: Dr. Diego Lz. de Ipiña Gz. de Artaza paginaspersonales.deusto.es/dipina  (Personal)

87/119

Patrones XPath para el atributo match o select

Seleccionar el nodo raiz: <xsl:template match="/"> ... </xsl:template> Seleccionar un elemento: <xsl:template match="student"> ...</xsl:template>

Seleccionar hijos de un elemento: <xsl:template match="course/student"> ... </xsl:template>

<xsl:template match="course/*/name"> ... </xsl:template>

Seleccionar descendientes de un elemento:<xsl:template match="course//name"> ... </xsl:template>

Page 88: Dr. Diego Lz. de Ipiña Gz. de Artaza paginaspersonales.deusto.es/dipina  (Personal)

88/119

Patrones XPath para el atributo match o select

Seleccionar atributo título:<xsl:value-of select="./@id"/>

Seleccionar comentarios:<xsl:template match="comment()"> ... </xsl:template>

Seleccionar elementos de texto:<xsl:template match="text()"> ... </xsl:template>

Recuperar posición que ocupa un sub-elemento dentro de elemento padre<xsl:value-of select="position()"/>

Page 89: Dr. Diego Lz. de Ipiña Gz. de Artaza paginaspersonales.deusto.es/dipina  (Personal)

89/119

Evaluando condiciones con []

Evaluando si una condición es cierta: Si el elemento estudiante tiene un hijo name<xsl:template match="student[name]"> Cualquier elemento que tiene un elemento name<xsl:template match="*[name]"> Elemento student tiene un sub-elemento hw1 o hw2 element<xsl:template match="student[hw1 | hw2]">

Page 90: Dr. Diego Lz. de Ipiña Gz. de Artaza paginaspersonales.deusto.es/dipina  (Personal)

90/119

Ejemplo XSLTProblema: Imprimir nombre de alumnos con nota media mayor de 65%

<?xml version="1.0"?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:output method="text"/> <xsl:template match="course"> <xsl:apply-templates select="student"/> </xsl:template> <xsl:template match="student"> <xsl:variable name="ave"> <xsl:value-of select="(hw1 + hw2 + project + final) div

4"/> </xsl:variable> <xsl:if test="$ave > 65">

Student name="<xsl:value-of select="name"/>" average="<xsl:value-of select="$ave"/>"

</xsl:if> </xsl:template> </xsl:stylesheet>

Page 91: Dr. Diego Lz. de Ipiña Gz. de Artaza paginaspersonales.deusto.es/dipina  (Personal)

91/119

Resultado transformación

Salida (grades70.txt):

Student name=“Usue Artaza" average="66,25"

Student name=“Iñigo Urrutia" average="77,5"

Page 92: Dr. Diego Lz. de Ipiña Gz. de Artaza paginaspersonales.deusto.es/dipina  (Personal)

92/119

XSLT en .NET

XSLT (Extensible Stylesheet Language Transformations ) es la herramienta de tratamiento estrella de XML.

XSLT es un lenguaje de programación para convertir documentos XML de un formato a otro.

XSLT tiene dos usos principales: Convertir documentos XML en HTML: útil para construir páginas

web y otros documentos XML dirigidos a browsers Convertir documentos XML en otros documentos XML

Las conversiones XSLT XML-a-XML son el núcleo de aplicaciones middleware como Microsoft BizTalk Server que automatizan los procesos de negocio orquestrando el flujo de información

La clase System.Xml.Xsl.XslCompiledTransform nos permite efectuar transformaciones XSLT.

Page 93: Dr. Diego Lz. de Ipiña Gz. de Artaza paginaspersonales.deusto.es/dipina  (Personal)

93/119

XSLT

La figura ilustra el funcionamiento de XSLT. Se necesita: Un documento fuente XML

a transformar Un documento XSL que

describe cómo el procesador XSLT debe transformar el documento

Page 94: Dr. Diego Lz. de Ipiña Gz. de Artaza paginaspersonales.deusto.es/dipina  (Personal)

94/119

Aplicando XSL en el Cliente I

<!– guitars.xml --><?xml version="1.0"?><?xml-stylesheet type="text/xsl" href="Guitars.xsl"?><Guitars> <Guitar> <Make>Gibson</Make> <Model>SG</Model> <Year>1977</Year> <Color>Tobacco Sunburst</Color> <Neck>Rosewood</Neck> </Guitar> <Guitar> <Make>Fender</Make> <Model>Stratocaster</Model> <Year>1990</Year> <Color>Black</Color> <Neck>Maple</Neck> </Guitar></Guitars>

Page 95: Dr. Diego Lz. de Ipiña Gz. de Artaza paginaspersonales.deusto.es/dipina  (Personal)

95/119

Aplicando XSL en el Cliente II

// guitars.xsl<?xml version="1.0"?><xsl:stylesheet

xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> <xsl:template match="/"> <html> <body> <h1>My Guitars</h1> <hr /> <table width="100%" border="1"> <tr bgcolor="gainsboro"> <td><b>Make</b></td> <td><b>Model</b></td> <td><b>Year</b></td> <td><b>Color</b></td> <td><b>Neck</b></td> </tr>

Page 96: Dr. Diego Lz. de Ipiña Gz. de Artaza paginaspersonales.deusto.es/dipina  (Personal)

96/119

Aplicando XSL en el Cliente II

<xsl:for-each select="Guitars/Guitar"> <tr> <td><xsl:value-of select="Make" /></td> <td><xsl:value-of select="Model" /></td> <td><xsl:value-of select="Year" /></td> <td><xsl:value-of select="Color" /></td> <td><xsl:value-of select="Neck" /></td> </tr> </xsl:for-each> </table> </body> </html> </xsl:template></xsl:stylesheet>

Page 97: Dr. Diego Lz. de Ipiña Gz. de Artaza paginaspersonales.deusto.es/dipina  (Personal)

97/119

Aplicando XSL en el Cliente III

Page 98: Dr. Diego Lz. de Ipiña Gz. de Artaza paginaspersonales.deusto.es/dipina  (Personal)

98/119

Aplicando XSL en el Servidor I<!-- quotes.xml --><?xml version="1.0"?><Quotes> <Quote> <Text>Give me chastity and continence, but not yet.</Text> <Author>Saint Augustine</Author> </Quote> <Quote> <Text>The use of COBOL cripples the mind; its teaching should therefore be regarded as a criminal offense.</Text> <Author>Edsger Dijkstra</Author> </Quote> <Quote> <Text>C makes it easy to shoot yourself in the foot; C++ makes it harder, but when you do, it blows away your whole leg.</Text> <Author>Bjarne Stroustrup</Author> </Quote> <Quote> <Text>A programmer is a device for turning coffee into code.</Text> <Author>Jeff Prosise (with an assist from Paul Erdos)</Author> </Quote> ...</Quotes>

Page 99: Dr. Diego Lz. de Ipiña Gz. de Artaza paginaspersonales.deusto.es/dipina  (Personal)

99/119

Aplicando XSL en el Servidor II

<?xml version="1.0"?> <!-- quotes.xsl --><xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> <xsl:template match="/"> <html> <body> <h1 style="background-color: teal; color: white; font-size: 24pt; text-align: center; letter-spacing: 1.0em"> Famous Quotes </h1> <table border="1"> <tr style="font-size: 12pt; font-family: verdana; font-weight: bold"> <td style="text-align: center">Quote</td> <td style="text-align: center">Author</td> </tr> <xsl:for-each select="Quotes/Quote"> <xsl:sort select="Author" /> <tr style="font-size: 10pt; font-family: verdana"> <td><xsl:value-of select="Text"/></td> <td><i><xsl:value-of select="Author"/></i></td> </tr> </xsl:for-each> </table> </body> </html> </xsl:template></xsl:stylesheet>

Page 100: Dr. Diego Lz. de Ipiña Gz. de Artaza paginaspersonales.deusto.es/dipina  (Personal)

100/119

Aplicando XSL en el Servidor III

<!-- quotes.aspx --><%@ Page Language="C#" %><%@ Import Namespace="System.Xml.XPath" %><%@ Import Namespace="System.Xml.Xsl" %>

<% XPathDocument doc = new XPathDocument (Server.MapPath ("Quotes.xml")); XslTransform xsl = new XslTransform (); xsl.Load (Server.MapPath ("Quotes.xsl")); xsl.Transform (doc, null, Response.OutputStream);%>

Page 101: Dr. Diego Lz. de Ipiña Gz. de Artaza paginaspersonales.deusto.es/dipina  (Personal)

101/119

Aplicando XSL en el Servidor IV

Page 102: Dr. Diego Lz. de Ipiña Gz. de Artaza paginaspersonales.deusto.es/dipina  (Personal)

102/119

Transform.csusing System;using System.Xml.XPath;using System.Xml.Xsl;class MyApp{ static void Main (string[] args) { if (args.Length < 2) { Console.WriteLine ("Syntax: TRANSFORM xmldoc xsldoc"); return; }

try { XPathDocument doc = new XPathDocument (args[0]); XslTransform xsl = new XslTransform (); xsl.Load (args[1]); xsl.Transform (doc, null, Console.Out); } catch (Exception ex) { Console.WriteLine (ex.Message); } }}

Page 103: Dr. Diego Lz. de Ipiña Gz. de Artaza paginaspersonales.deusto.es/dipina  (Personal)

103/119

XSLT Object Extensions

La clase System.Xml.Xsl.XslCompiledTransform provee dos mecanismos para crear extensiones de usuario: Las páginas XSLT pueden contener funciones escritas en C#,

VB.NET o JavaScript dentro de elementos msxml:script Pueden invocarse desde dentro de la hoja de estilo

Usar objetos de extensión XSLT Objetos cuyos métodos públicos son accesibles desde la hoja de

estilo una vez añadidos al objeto XslTransform mediante el método AddExtensionObject

Ventajas objetos de extensión XSLT: Desacoplan las extensiones de una página concreta Pueden reutilizarse tales extensiones

Page 104: Dr. Diego Lz. de Ipiña Gz. de Artaza paginaspersonales.deusto.es/dipina  (Personal)

104/119

XSL Scripts

Solamente funciona para IE Documentación en:

http://msdn2.microsoft.com/en-us/library/ms256042(VS.80).aspx

Elemento a utilizar msxsl:script Ejemplo XML:

<?xml version="1.0" ?> <?xml-stylesheet type="text/xsl" href="XslScriptExample.xsl"?>

<prueba/>

Page 105: Dr. Diego Lz. de Ipiña Gz. de Artaza paginaspersonales.deusto.es/dipina  (Personal)

105/119

XSL Scripts

Ejemplo XSL:<?xml version="1.0"?><xsl:stylesheet

xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:msxsl="urn:schemas-microsoft-com:xslt" xmlns:user="http://mycompany.com/mynamespace" version="1.0"> <xsl:template match="/">

<xsl:value-of select="user:xml(.)"/><xsl:value-of select="user:clock()"/>

</xsl:template>

<msxsl:script language="JavaScript" implements-prefix="user"><![CDATA[function xml(nodelist) { return nodelist.nextNode().xml;}]]>

</msxsl:script>

Page 106: Dr. Diego Lz. de Ipiña Gz. de Artaza paginaspersonales.deusto.es/dipina  (Personal)

106/119

XSL Scripts<msxsl:script language="JavaScript" implements-prefix="user"> <![CDATA[ function clock() { var time = new Date(); var hours = time.getHours(); var min = time.getMinutes(); var sec = time.getSeconds(); var status = "AM"; if (hours > 11) { status = "PM"; } if (hours < 11) { hours -= 12; } if (min < 10) { min = "0" + min; } if (sec < 10) { sec = "0" + sec; } return hours + ":" + min + ":" + sec + " " + status; } ]]></msxsl:script>

</xsl:stylesheet>

Page 107: Dr. Diego Lz. de Ipiña Gz. de Artaza paginaspersonales.deusto.es/dipina  (Personal)

107/119

Transformación con JavaScript

<html> <body> <script type="text/javascript">// Load XML var xml = new ActiveXObject("Microsoft.XMLDOM") xml.async = false xml.load("cdcatalog.xml")// Load XSL var xsl = new ActiveXObject("Microsoft.XMLDOM") xsl.async = false xsl.load("cdcatalog.xsl")// Transform document.write(xml.transformNode(xsl)) </script> </body></html>

Page 108: Dr. Diego Lz. de Ipiña Gz. de Artaza paginaspersonales.deusto.es/dipina  (Personal)

108/119

XSLT Object Extensions

Microsoft recomienda evitar el uso de scripts in-line en hojas XSLT Para implementar funcionalidad extra es mejor utilizar

códigos de bloque externos Revisar ejemplo en las siguientes transparencias

Page 109: Dr. Diego Lz. de Ipiña Gz. de Artaza paginaspersonales.deusto.es/dipina  (Personal)

109/119

Ejemplo Extensions Object// Compile: csc /target:library Products.csusing System;using System.Data.SqlClient;namespace InventoryExtensionObject{ public class Products { SqlConnection cn; public Products()

{ cn = new SqlConnection(@"server=localhost\

SQLEXPRESS;database=northwind;uid=sa;pwd=distributed.net"); cn.Open(); }

public int GetCurrentStockLevel(int ProductId) { SqlCommand cmd = new SqlCommand("Select UnitsInStock from Products where" + "

ProductID = " + ProductId, cn); int UnitsInStock = Convert.ToInt32(cmd.ExecuteScalar());

return UnitsInStock; }

public void Dispose() {

cn.Close(); } }}

Page 110: Dr. Diego Lz. de Ipiña Gz. de Artaza paginaspersonales.deusto.es/dipina  (Personal)

110/119

Products.xml

<?xml version="1.0" encoding="ISO-8859-1" ?>

<Products><Product id="1" name=“chorizo"/><Product id="2" name=“jamón"/><Product id="3" name=“salami"/>

</Products>

Page 111: Dr. Diego Lz. de Ipiña Gz. de Artaza paginaspersonales.deusto.es/dipina  (Personal)

111/119

Products.xsl<?xml version='1.0' encoding="ISO-8859-1" ?><!-- Notice how a namespace URI and prefix are declared to reference EO --> <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0" xmlns:InventoryExtensionObj="urn:InventoryExtensionObj"><xsl:template match="Products"> <HTML> <BODY> <H3>Ipiña Altzariak</H3><BR/> <TABLE BORDER="1"> <TR> <TH>Product Id</TH>

<TH>Product Name</TH> <TH>Units In Stock</TH>

</TR> <xsl:for-each select="Product"> <TR> <TD><xsl:value-of select="@id"/></TD> <TD><xsl:value-of select="@name"/></TD> <!-- call extension object method to retrieve stock information --> <TD><xsl:value-of

select="InventoryExtensionObj:GetCurrentStockLevel(@id)"/></TD> </TR> </xsl:for-each> </TABLE> </BODY> </HTML></xsl:template> </xsl:stylesheet>

Page 112: Dr. Diego Lz. de Ipiña Gz. de Artaza paginaspersonales.deusto.es/dipina  (Personal)

112/119

Ejemplo Aplicación usando EO// Compile: csc /r:Products.dll ProductsStockLevel.csusing System;using System.Text;using System.Xml;using System.Xml.XPath;using System.Xml.Xsl;

namespace InventoryExtensionObject{ public class ProductsStockLevel { public static void Main(string [] args) { try { XPathDocument xmlDoc = new XPathDocument("products.xml");

// Instantiate a new XslTransform object and load the style sheet. XslCompiledTransform xslt = new XslCompiledTransform(); xslt.Load("products.xsl"); // Instantiate an XsltArgumentList object. // An XsltArgumentList object is used to supply extension object instances

// and values for XSLT paarmeters required for an XSLT. transformation XsltArgumentList xsltArgList = new XsltArgumentList();

//Instantiate and Add an instance of extension object to XsltArgumentList. InventoryExtensionObject.Products InventoryExtensionObj =

new InventoryExtensionObject.Products(); xsltArgList.AddExtensionObject("urn:InventoryExtensionObj", InventoryExtensionObj);

Page 113: Dr. Diego Lz. de Ipiña Gz. de Artaza paginaspersonales.deusto.es/dipina  (Personal)

113/119

Ejemplo Aplicación usando EO

// Execute the transformation and generate the output to results.html XmlWriterSettings settings = new XmlWriterSettings(); settings.Encoding = Encoding.GetEncoding("iso-8859-1"); XmlWriter xmlWriter = XmlWriter.Create("results.html", settings); xslt.Transform(xmlDoc, xsltArgList, xmlWriter); InventoryExtensionObj.Dispose(); InventoryExtensionObj = null; } // Exception handling code. catch(XsltCompileException xsltCompileExp) { Console.WriteLine(xsltCompileExp.Message); } catch(XsltException xsltExp) { Console.WriteLine(xsltExp.Message); } catch(XPathException XPathExp) { Console.WriteLine(XPathExp.Message); } catch(XmlException XmlExp) { Console.WriteLine(XmlExp.Message); } } }}

Page 114: Dr. Diego Lz. de Ipiña Gz. de Artaza paginaspersonales.deusto.es/dipina  (Personal)

114/119

EXSLT

Iniciativa para proporcionar extensiones a XSLT http://www.exslt.org/

Objetivo: extender su uso entre los implementadores de motores XSLT para incrementar la portabilidad de hojas XSLT

Define los siguientes módulos: Common EXSLT: exsl:node-set, exsl:object-type Math EXSLT: math:min, math:max, math:highest, math:abs, math:random

Sets EXSLT: set:difference, set:intersection, set:distinct

Dates and Times EXSLT: date:date-time, date:time, date:month-name, date:seconds

Strings EXSLT: str:tokenize, str:replace Regular Expressions EXSLT: regexp:test, regexp:match, regexp:replace

Page 115: Dr. Diego Lz. de Ipiña Gz. de Artaza paginaspersonales.deusto.es/dipina  (Personal)

115/119

XSLT Object Extensions

Es una implementación de las extensiones EXSLT para XSLT 1.0 para la framework .NET: Web: http://mvp-xml.sourceforge.net/exslt/ Download: http://sourceforge.net/project/showfiles.php?

group_id=102352 Ejemplos interesantes: http://msdn2.microsoft.com/en-

us/library/ms950776.aspx EXSLT: iniciativa para crear extensiones para XSLT

Page 116: Dr. Diego Lz. de Ipiña Gz. de Artaza paginaspersonales.deusto.es/dipina  (Personal)

116/119

XSLT Object Extensions

//Create the XslTransform and load the stylesheet.XslTransform xslt = new XslTransform();xslt.Load("test.xsl");//Load the XML data file.XPathDocument doc = new XPathDocument("test.xml");//Create an XsltArgumentList and add the EXSLT object

for the math functionsXsltArgumentList xslArg = new XsltArgumentList();xslArg.AddExtensionObject("http://exslt.org/math", new

ExsltMath());//Create an XmlTextWriter to output to the console.XmlTextWriter writer = new XmlTextWriter(Console.Out);//Transform the file.xslt.Transform(doc, xslArg, writer, null);writer.Close();

Page 117: Dr. Diego Lz. de Ipiña Gz. de Artaza paginaspersonales.deusto.es/dipina  (Personal)

117/119

Conclusión

Las clases en el espacio de nombres System.Xml simplifican la lectura, escritura y manipulación de documentos XML

Miembros destacados de System.Xml son: XmlDocument, que provee una interfaz DOM a documentos XML XmlTextReader y XmlValidatingReader, que combina la

eficiencia de SAX con un modelo sencillo PULL para leer XML y validarlo opcionalmente

XmlTextWriter, que escribe documentos Xml XPathDocument, XPathNavigator, y XPathNodeIterator,

que permiten la realización de consultas XPath en documentos Xml e iterar sobre los resultados

XslCompiledTransform, que efectúa transformaciones XSL en datos XML.

XML es una realidad del desarrollo software actual La FCL de .NET nos simplifica este proceso

Page 118: Dr. Diego Lz. de Ipiña Gz. de Artaza paginaspersonales.deusto.es/dipina  (Personal)

118/119

Referencias

XML DOM Tutorial http://www.w3schools.com/dom/default.asp

XSLT Tutorial http://www.w3schools.com/xsl/default.asp

HOW TO: Use Extension Objects When You Execute XSL Transformations in Visual C# .NET Applications http://support.microsoft.com/kb/323370

EXSLT: Enhancing the Power of XSLT http://msdn2.microsoft.com/en-us/library/ms950776.aspx

Ejemplos interesantes de uso de EXSLT: http://msdn2.microsoft.com/en-us/library/ms950776.aspx

Nuevas características .NET XML 2.0: http://www.15seconds.com/issue/050601.htm

Page 119: Dr. Diego Lz. de Ipiña Gz. de Artaza paginaspersonales.deusto.es/dipina  (Personal)

XML, Distribución y Componentes

Tema 1 – Procesamiento XML en .NET –Preguntas y Sugerencias

Dr. Diego Lz. de Ipiña Gz. de Artazahttp://paginaspersonales.deusto.es/dipina (Personal)

http://www.morelab.deusto.es (Research Group)http://www.smartlab.deusto.es (Research Lab)

http://www.ctme.deusto.es (Cátedra de Telefónica Móviles)http://www.tecnologico.deusto.es (Tecnológico-Fundación Deusto)