XML Integración de Sistemas Parte II. Diseño e implementación de aplicaciones Web con.net
Recordatorio XML Documento XML Bien formado ( well-formed ) si cumple reglas Válido si cumple las restricciones de un esquema Tipos de esquemas más usados DTD (Document Type Definition) Esquema XML (XML Schema) Elementos y atributos Todo documento debe tener un elemento raíz Un elemento puede tener atributos Más información en: http://www.tic.udc.es/is-java/tema2-1.pdf
Recordatorio XML Campos de aplicación Configuración de aplicaciones Generación de vistas Intercambio de datos entre aplicaciones heterogéneas Etc. Más información en: http://www.tic.udc.es/is-java/tema2-2.pdf
Ejemplo de documento XML <?xml version="1.0"?> <bookstore> <book genre="autobiography" publicationdate="1981" ISBN="1-861003-11-0"> <title>the Autobiography of Benjamin Franklin</title> <author> <first-name>benjamin</first-name> <last-name>franklin</last-name> </author> <price>8.99</price> </book> <book genre="novel" publicationdate="1967" ISBN="0-201-63361-2"> <title>the Confidence Man</title> <author> <first-name>herman</first-name> <last-name>melville</last-name> </author> <price>11.99</price> </book> </bookstore>
Análisis de ficheros XML Los lenguajes más usuales disponen de parsers XML ya desarrollados En.NET XmlReader Analizador rápido, forward-only y sin almacenamiento en caché Proporciona propiedades y eventos específicos XmlDocument Representación de un documento XML Válido para aplicar transformaciones XSLT LINQ to XML Interfaz de programación XML en memoria Permite utilizar expresiones LINQ desde los lenguajes de programación de.net Framework
XmlReader Clase abstracta que proporciona acceso a datos XML forward-only read-only Sin caché Lectura datos XML en profundidad (top-down) Acceso en el mismo orden en el que los datos se definen en el fichero XML Análogo al trabajo con objetos DataReader en acceso a Base de Datos
XmlReader Métodos principales public static XmlReader Create(string inputuri); public static XmlReader Create(string inputuri, XmlReaderSettings settings); Instancia una clase concreta de XmlReader Configurable mediante objeto XmlReaderSettings public abstract bool Read(); Avanza posición cursor al siguiente nodo public abstract bool MoveToFirstAttribute(); public abstract bool MoveToNextAttribute();
XmlReader Propiedades principales public virtual bool HasAttributes { get; } public virtual string Name { get; } Nombre del nodo que se está procesando Por ejemplo, Name es bk:book para el elemento <bk:book> public abstract string Value { get; } Valor del nodo que se está procesando public abstract XmlNodeType NodeType { get; } Tipo de nodo que se está procesando XmlNodeType es una enumeración: XmlNodeType.Element, XmlNodeType.EndElement, XmlNodeType.Text, etc.
XmlReader // XmlReader Configuration XmlReaderSettings settings = new XmlReaderSettings(); settings.ignorewhitespace = true; settings.ignorecomments = false; // Retrieve XML document from URI XmlReader xmlreader = XmlReader.Create(uriString, settings); // Read nodes one at a time and process it while (xmlreader.read()) { switch (xmlreader.nodetype) { case XmlNodeType.Element: // Display beginning of element and attributes if exist Console.Write("<{0}", xmlreader.name);
XmlReader if (xmlreader.hasattributes) while (xmlreader.movetonextattribute()) Console.Write(" {0}='{1}'", xmlreader.name, xmlreader.value); Console.WriteLine(">"); break; case XmlNodeType.Text: // Display the text in each element. Console.WriteLine(xmlReader.Value); break; case XmlNodeType.EndElement: } // switch } // while // Display end of element Console.WriteLine("</{0}>", xmlreader.name); break;
XmlDocument Implementación de las especificaciones de nivel 1 y 2 del W3C XML Document Object Model (DOM) Representa documentos XML como objetos Todos los nodos son accesibles en cualquier momento Proporciona métodos para cambiar, insertar o eliminar nodos Válido para aplicar transformaciones XSLT Análogo al trabajo con objetos DataAdapter/DataSet en acceso a Base de Datos
XmlDocument Métodos principales public virtual void Load(Stream instream); public virtual void Load(string filename); public virtual void Load(TextReader txtreader); public virtual void Load(XmlReader reader); // Create a new XmlDocument XmlDocument xmldocument = new XmlDocument(); // Load data xmldocument.load(uristring);
XmlDocument Métodos principales public XmlElement CreateElement(string name); XmlElement xmlelement = xmldocument.createelement("newelementname"); XmlText textelement = xmldocument.createtextnode("newelementvalue"); //Adds the element within root node xmldocument.documentelement.appendchild(xmlelement); xmldocument.lastchild.appendchild(textelement);
XmlDocument Métodos principales public XmlAttribute CreateAttribute(string name); XmlAttribute xmlattribute = xmldocument.createattribute("newattribute"); xmlattribute.value = "newattributevalue"; //Add the new attibutte to the root document. //Add the new attibutte to the root document. xmldocument.documentelement.setattributenode(xmlattribute);
XmlDocument Navegación por los nodos: XPathNavigator Permite seleccionar un subconjunto a partir de una expresión XPath // Create a new XmlDocument XmlDocument xmldocument = new XmlDocument(); // Load data xmldocument.load(...); // Get data with XPath XPathNavigator navigator = xmldocument.createnavigator(); String xpathexpression =... XPathNodeIterator iterator = navigator.select(xpathexpression); // Show results while (iterator.movenext ()) { // process selection here with iterator.current.value }
XPath Lenguaje empleado para la selección de elementos Nodos por posición absoluta Nodos por posición relativa Contenido Sintaxis diferente a XML XSLT emplea expresiones XPath para la selección de elementos y mapeo de patrones en el documento de entrada Proporciona una ruta que especifica un conjunto de nodos de salida Soporta operaciones de comparación, lógicas, etc.
XPath Una ruta devuelve siempre una secuencia de nodos En el mismo orden en el que se encuentran en el documento original Una ruta consiste en una serie de pasos, separados por / Puede representar Rutas absolutas: /bookstore/movie/director Rutas relativas: movie/director Elementos que forman parte de una ruta / : selecciona el hijo inmediatamente inferior Al inicio del patrón indica la raíz del documento XML //element : selecciona elementos de tipo element en cualquier nivel. : representa el elemento actual.. : representa el padre del nodo actual @ : se emplea para el acceso a los atributos (@attributename) /element[n] : accede al n-ésimo atributo del elemento element
XPath./author Busca todos los elementos de tipo author dentro del contexto actual /bookstore Busca el elemento bookstore a partir de la raíz //author Busca todos los elementos author, independientemente de su posición en el documento /book[@type = "novel"] Busca los elementos book en los que el atributo type tome el valor novel /book[@style = /bookstore/@specialty] Busca todos los elementos book para los que el atributo style sea coincidente con el atributo specialty del elemento bookstore de la raíz del documento
Transformaciones XSLT en ASP.NET Pueden realizarse fácilmente con la ayuda del control de servidor <asp:xml> System.Web.UI.WebControls.Xml Propiedades de interés: public XmlDocument Document { get; set; } Permite establecer/recuperar el System.Xml.XmlDocument que se mostrará en el control Obsoleto: se recomienda utilizar la propiedad XPathNavigator public string DocumentSource { get; set; } Permite establecer/recuperar el path a un documento XML que se mostrará en el control public XPathNavigator XPathNavigator { get; set; } Permite establecer/recuperar un modelo de cursor para navegar y editar los datos XML asociados con el control
Transformaciones XSLT en ASP.NET Propiedades de interés (cont): public XslTransform Transform { get; set; } Permite establecer/recuperar el objeto System.Xml.Xsl.XslTransform que formatea el documento XML antes de que se muestre en el control XslTransform está obsoleto a favor de XslCompiledTransform public string TransformSource { get; set; } Permite establecer/recuperar el path a una hoja de estilos XSLT que formatee el documento XML antes de que se muestre en el control public XsltArgumentList TransformArgumentList { get; set; } Permite establecer/recuperar un objeto System.Xml.Xsl.XsltArgumentList que contiene una lista de argumentos opcionales pasados a la hoja de estilos y utilizados durante la transformación XSL
Transformaciones XSLT en ASP.NET En el fichero.aspx: <%@ Page Language="C#"... %> <<...>> <asp:xml ID="aspXml" runat="server"> </asp:xml> <<...>>
Transformaciones XSLT en ASP.NET En el CodeBehind: Acceso a documento XML Local: aspxml.documentsource = Server.MapPath("Movies.xml"); Remoto: XmlDocument xmldocument = new XmlDocument(); xmldocument.load("http://.../movies.xml"); aspxml.xpathnavigator = xmldocument.createnavigator(); Archivo de transformación XSL aspxml.transformsource = Server.MapPath("Movies.xslt");
The Extensible Stylesheet Language Family (XSL) Conjunto de recomendaciones para definir la transformación y presentación de documentos XML Componentes XSL Transformations (XSLT) Lenguaje para la transformación de documentos XML XML Path Language (XPath) Especificación empleada en XSLT para acceder a las partes de un documento XML XSL Formatting Objects (XSL-FO) Vocabulario XML para especificar la semántica del formateo Más información en: http://www.w3.org/style/xsl/
XSLT (extensible Stylesheet Language Transformations) Describe un lenguaje basado en XML para transformar documentos XML a cualquier otro formato Normalmente se empleará para transformar documentos entre esquemas XML que permitan su procesamiento por distintos sistemas También es ampliamente utilizado para transformar documentos También es ampliamente utilizado para transformar documentos XML en HTML, WML, o cualquier otro formato que facilite su presentación
Transformaciones XSL Una hoja de estilo XSLT es un documento XML bien formado Generalmente con extensión xsl (o xslt) Debe comenzar con una declaración XML: <?xml version="1.0"?> El elemento raíz de la hoja de estilo XSLT es <xsl:stylesheet> Este elemento contendrá a todos los demás, y debe ir precedido por el alias xsl correspondiente al espacio de nombres para hojas de estilo XSLT. Una plantilla xsl está formada por una lista de reglas. Contienen: Un patrón indicando la parte del árbol XML a la que se aplica Una plantilla que produce la salida cuando se cumple el patrón
Transformaciones XSL Plantillas Controlan la salida originada desde cada entrada Representadas por un elemento xsl:template Atributo match especifica un patrón (expresión Xpath) que identifica las entradas a las que se aplica la plantilla Patrón más sencillo es el nombre de un elemento (e.g. BOOK) Ejemplo (Books.xsl): <?xml version="1.0" encoding="utf-8"?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/xsl/transform"> <xsl:template match="book">book Matched<br/></xsl:template> </xsl:stylesheet>
Transformaciones XSL Pasos seguidos por el procesador XSL para formatear un documento XML Escaneo del documento buscando cada subárbol Comparación de cada subárbol con los patrones especificados en las plantillas Ante una coincidencia, se aplica la regla indicada por la plantilla Generalmente incluye nuevos datos o modificación de los datos XML originales
Transformaciones XSL La regla <xsl:template match="/"> se ejecuta cuando se encuentra el elemento raíz del documento XML Dentro de esta regla, se incluyen llamadas a otras reglas definidas en la hoja de estilo <xsl:apply-templates select="..." /> El atributo select tomará como valor el nombre del elemento asociado a la regla que se quiere ejecutar Permite control sobre el orden de ejecución de las reglas Si el atributo select no se especifica, las reglas se aplicarán en el orden en que se encuentren elementos coincidentes durante el acceso al árbol XML
Transformaciones XSL Ejemplo <?xml version="1.0"?> <bookstore> <book genre="autobiography" publicationdate="1981" ISBN="1-861003-11-0"> <title>the Autobiography of Benjamin Franklin</title> <author> <first-name>benjamin</first-name> <last-name>franklin</last-name> </author> <price>8.99</price> </book> </bookstore> <?xml version="1.0"?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/xsl/transform"> Fichero XML Hoja de estilos XSLT <xsl:template match="/"> <xsl:apply-templates /> </xsl:template> <xsl:template match="book"> <p>book matched</p> </xsl:template> </xsl:stylesheet> <?xml version="1.0" encoding="utf-8"?> Resultado <p>book Matched</p>
Transformaciones XSL Elemento <xsl:value-of...> Obtiene el valor de un elemento Texto incluido en el elemento una vez las etiquetas han sido eliminadas Atributo select indica mediante una expresión XPath el elemento seleccionado <?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:template match="book"> <p> <xsl:value-of select="title"/> </p> </xsl:template> </xsl:stylesheet> <?xml version="1.0" encoding="utf-8"?> <p>the Autobiography of Benjamin Franklin</p>
Transformaciones XSL Aplicación de reglas <?xml version="1.0"?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/xsl/transform"> <xsl:template match="bookstore"> <html> <head> <title>bookstore</title> </head> <body> <xsl:apply-templates/> </body> </html> </xsl:template> <xsl:template match="book"> <p> <xsl:value-of select="title"/> </p> <xsl:apply-templates select="author"/> </xsl:template> <xsl:template match="author"> <p> <xsl:value-of select="last-name"/>, <xsl:value-of select="first-name"/> </p> </xsl:template> <html> <head> <title>bookstore</title> </head> <body> <p>the Autobiography of Benjamin Franklin</p> <p>franklin, Benjamin</p> </body> </html> </xsl:stylesheet>
Transformaciones XSL Aplicación de reglas condicionada: <xsl:if...> <xsl:if> Aplicación de la regla depende de la evaluación del parámetro test No existe apartado else <xsl:template match="book"> <xsl:if test="price<10"> <p> <xsl:value-of select="title"/> </p> </xsl:if> </xsl:template>
Transformaciones XSL <xsl:choose>, <xsl:when>, <xsl:otherwise> Amplían las posibilidades del elemento <xsl:if> Permiten indicar qué transformación se debe realizar en el caso de que se cumpla una condición, y en el resto de casos Se utilizan de forma conjunta El elemento xsl:choose contendrá uno o más elementos xsl:when y un elemento xsl:otherwise El elemento xsl:when incluye un atributo test que tomará como valor la expresión que se evaluará Si se cumple, se ejecutará el código escrito entre las etiquetas de inicio y de fin del elemento xsl:when El elemento xsl:otherwise contendrá el código que se ejecutará si no se cumplen las expresiones indicadas en los atributos test de los elementos xsl:when
Transformaciones XSL <xsl:choose>, <xsl:when>, <xsl:otherwise> <xsl:choose> <xsl:when test="boolean-expression1"> <!-- template actions="" --> </xsl:when> <xsl:when test="boolean-expression2"> <!-- template actions="" --> </xsl:when> <xsl:otherwise> <!-- template actions="" --> </xsl:otherwise> </xsl:choose>
Transformaciones XSL <xsl:element>, <xsl:attribute> <xsl:element> Se utiliza para crear elementos en el documento resultado de la transformación Es especialmente útil cuando se utiliza XSLT para transformar un documento XML en otro con una estructura diferente (ej. HTML) Irá acompañado por un atributo name Tomará como valor el nombre del elemento que se va a crear <xsl:attribute> Permite crear un atributo en el documento de salida Irá acompañado por un atributo name <xsl:element name="a"> <xsl:attribute name="href"> <xsl:value-of select="url"/> </xsl:attribute> <xsl:value-of select="title"/> </xsl:element> <a href="url_value">title value</a>
Acceso directo a recursos Web System.Net.HttpWebRequest Implementa la clase abstracta WebRequest Encapsula una petición HTTP Métodos principales GetResponse(): WebResponse Obtiene la respuesta proporcionada por el servidor GetRequestStream(): Stream Obtiene un Stream para escribir los datos de la petición Propiedades principales RequestURI Obtiene la URI original de la petición ProtocolVersion Versión del protocolo HTTP empleada en la petición Headers Colección de los encabezados HTTP de la petición
Acceso directo a recursos Web System.Net.HttpWebResponse Implementa la clase abstracta WebResponse Encapsula una respuesta HTTP Objetos HttpWebResponse no deberían crearse directamente Crearlos por medio de una llamada a WebRequest.GetResponse()
Acceso directo a recursos Web System.Net.HttpWebResponse Métodos principales GetResponseHeader(string headername): string Obtiene el valor de las cabeceras HTTP devueltas con la response GetResponseStream(): Stream Obtiene un Stream para la lectura del cuerpo de la respuesta Propiedades principales ProtocolVersion Versión del protocolo HTTP de la respuesta StatusCode Obtiene el estado de la respuesta Headers Colección de los encabezados HTTP de la respuesta
Acceso directo a recursos Web Ejemplo public void GetResourceAsString(string uristring) { } string result = ""; // Create the web request to a Uniform Resource Identifier (URI) Uri addressuri = new Uri(uriString); HttpWebRequest request = (HttpWebRequest)WebRequest.Create(addressURI); // Get response from the specified resource in the request HttpWebResponse response = (HttpWebResponse)request.GetResponse(); // Get the response stream to read the body response from server StreamReader reader = new StreamReader(response.GetResponseStream()); // Read the whole contents and return it as a string result = reader.readtoend(); Console.WriteLine(result);