Sei sulla pagina 1di 21

XML desde .

NET

María Teresa Martín Calvilla


Miguel Vaquero Herrero

Departamento de Informática y Automática


Universidad de Salamanca

-1-
XML desde .NET

Información de los autores:


María Teresa Martín Calvilla
Miguel Vaquero Herrero

Este documento puede ser libremente distribuido.


© <<2005>> Departamento de Informática y Automática - Universidad de Salamanca.

Programación Orientada a Objetos


2
Martín y Vaquero

Resumen

Este informe muestra la forma de trabajar con documentos XML desde la plataforma
.NET. Para ello, se realiza una introducción al lenguaje XML con un breve ejemplo.
Posteriormente, se describe cómo almacenar el estado de un objeto para comunicárselo
a otro mediante el protocolo SOAP y que sea recuperado.
Se presentan las clases más importantes para la manipulación de documentos XML
(lectura y escritura) situadas dentro del espacio de nombres System.Xml que
proporciona el framework. Se codifican dos programas ejemplo utilizando el lenguaje
C# para ilustrarlo.

Abstract

This report shows the way to work with XML documents from .NET platform. For that,
an introduction to XML is given with a simple example. Then, it describes how to store
an object and send it to another object with SOAP protocol.
The most important classes to work with XML (read and write) which System.Xml
framework’s namespace provides are explained. Two C# program samples are attached
to show that.

3 Programación Orientada a Objetos


XML desde .NET

Tabla de Contenidos

1. Introducción a XML..................................................................... 4
1.1. ¿Qué es XML? 4
1.2. Breve historia 4
1.3. Diferencias con HTML 5
1.4. Principales características 5
1.5. Sintaxis de un documento XML 6
1.6. Hojas de estilo 7
2. Ejemplo......................................................................................... 8
3. Características para el uso de XML y C#..................................... 10
4. Clases en System.Xml.................................................................. 12
5. Ejemplo:
5.1 XmlWriter 14
5.2 XmlReader 17
6. Conclusiones................................................................................ 19
7. Enlaces……................................................................................. 20

Tabla de figuras

Figura 1. Origen de XML………………………………………… Página 5


Figura 2. Estructura de un DTD ………………………………….. Página 9
Figura 3. Anatomía de un mensaje SOAP……………………….. Página 10

Programación Orientada a Objetos


4
Martín y Vaquero

1. INTRODUCCIÓN A XML

1.1 ¿Qué es XML?

XML (Extensible Markup Language) es un lenguaje de marcado que proporciona un


formato para describir datos. Con ello se facilita la realización de declaraciones de
contenido más precisas y la obtención de resultados de búsqueda más significativos en
varias plataformas.

1.2 Breve historia de XML

La versión 1.0 del lenguaje XML es una recomendación del W3C desde Febrero de
1998. Está basado en el estándar SGML (Standard Generalized Markup Language, ISO
8879), que data de 1986, pero que empezó a gestarse desde principios de los aros 70.
SGML, a su vez, está basado en el GML creado por IBM en 1969. Esto significa que
aunque XML pueda parecer moderno, sus conceptos están más que asentados y
aceptados de forma amplia.

Está además asociado a la recomendación del W3C DOM (Document Object


Model), aprobado también en 1998. Éste no es más que un modelo de objetos (en forma
de API) que permite acceder a las diferentes partes que pueden componer un documento
XML o HTML. Es un modelo independiente de la plataforma y del lenguaje de
programación. El objetivo es que cualquier script pueda ejecutarse de forma más o
menos homogénea en cualquier navegador que soporte dicho DOM.

SGML proporciona un modo consistente y preciso de aplicar etiquetas para


describir las partes que componen un documento, permitiendo además el intercambio de
documentos entre diferentes plataformas. Sin embargo, el problema que se atribuye a
SGML es su excesiva dificultad.

Así que, manteniendo su misma filosofía, de él se derivó XML como subconjunto


simplificado, eliminando las partes más engorrosas y menos útiles. Como su padre,
XML es un metalenguaje, es decir, es un lenguaje para definir lenguajes. Los elementos
que lo componen pueden dar información sobre lo que contienen, no necesariamente
sobre su estructura física o presentación, como ocurre en HTML.

5 Programación Orientada a Objetos


XML desde .NET

1.3 Diferencias con HTML

En una primera aproximación podemos pensar que mediante XML también podemos
definir el HTML. La diferencia fundamental entre ellos es que HTML es simplemente
un lenguaje, mientras que XML como se ha dicho es un metalenguaje. XML permite la
separación de la presentación de datos. Así, si en HTML se utilizan etiquetas para
indicarle al explorador que muestre los datos como negrita o cursiva, en XML se
emplean únicamente para describir datos. XML mejora a HTML ya que establece un
estándar fijo al que atenerse separando el contenido de la presentación y se propone
como lenguaje de bajo nivel (a nivel de aplicación, no de programación) para el
intercambio de información estructurada entre diferentes plataformas.

SGML

XML

HTML

Figura I: "Origen de XML”

1.4 Principales características de XML

Tipos de documentos XML

Existen dos tipos de documentos XML:

• Bien formados: cumplen las especificaciones del lenguaje respecto a las reglas
sintácticas sin estar sujetos a unos elementos fijados en un DTD. De hecho, los
documentos XML deben tener una estructura jerárquica muy estricta, y los documentos
bien formados deben cumplirla.

• Válidos: además de estar bien formados, siguen una estructura y una semántica
determinada por un DTD: sus elementos y sobre todo la estructura jerárquica que define
el DTD, además de los atributos, deben ajustarse a lo que el DTD dicte.

Programación Orientada a Objetos


6
Martín y Vaquero

¿Qué es un DTD?

En la clasificación anterior se ha hablado de DTD (Document Type Definition) que


es una definición de los elementos que puede incluir un documento XML, de la forma
en que deben hacerlo (qué elementos van dentro de otros) y los atributos que se les
puede dar. En definitiva, es una especie de definición de la gramática del documento.
Cuando se procesa cualquier información formateada mediante XML, lo primero es
comprobar si está bien formada, y luego, si incluye o referencia a un DTD, comprobar
que sigue sus reglas gramaticales.

De ahí, la diferencia entre:

1 Parsers no validadores: procesan documentos XML sin comprobar que siguen


las reglas marcadas por un DTD. Sólo comprueban que está bien formado.
2 Parsers validadores: comprueban que además de ser un documento bien
formado se atiene a su DTD y por tanto, es válido.

1.5 Sintaxis de un documento XML


Antes de empezar con el estudio de las etiquetas, debemos resaltar una serie de aspectos
sobre los documentos en XML:

ƒ diferencian mayúsculas y minúsculas,


ƒ todos los espacios y retornos de carro se tienen en cuenta,
ƒ hay ciertos caracteres especiales reservados Su sintaxis es: &nombre.
ƒ los valores de los atributos de todas las etiquetas deben ir siempre
entrecomillados.

Debemos diferenciar entre:

• Elementos: son las entidades en sí, lo que tiene contenido. Hay dos tipos:

ƒ Vacíos: no tienen contenido dentro del documento. Son de la forma:


<etiqueta/>

ƒ No vacíos

• Etiquetas: sólo describen a los elementos.

7 Programación Orientada a Objetos


XML desde .NET

Un documento XML está compuesto por elementos, y en su sintaxis éstos se


nombran mediante etiquetas.

Los elementos de un documento XML pueden a su vez contener subelementos, con


la única restricción de que toda etiqueta no vacía debe tener una etiqueta de cerrado, de
forma que <etiqueta> debe estar seguida de </etiqueta>. De esta manera todos los
elementos quedarán perfectamente anidados.

1.6 Hojas de estilo

Se usan hojas de estilos, para mostrar los datos en un explorador. Como hemos dicho
antes, en XML se separan los datos de la presentación y el proceso, de forma que es
posible mostrar y procesar los datos según se desee, aplicando distintas aplicaciones y
hojas de estilos. Para definir hojas de estilo tenemos el lenguaje XSL (Extensible
Stylesheet Language) que es un lenguaje para transformar documentos XML y CSS
(Cascading Style Sheets).

Programación Orientada a Objetos


8
Martín y Vaquero

2. EJEMPLO

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>


<book>
<title>Learning to Program the Object-Oriented Way with
C#</title>
<author>Vinny Cahill & Donal Lafferty</autor>
<price>63.95$</price>
<publisher>Springer</publisher>
<ISBN>1852336021</ISBN>
<paperback>608 pages</paperback>
</book>

La primera línea es la forma en la que debe empezar cualquier documento XML en


la que indicamos la versión de XML utilizada en el documento, el tipo de codificación y
si va acompañado de un DTD (standalone="no"), o no lo necesita
(standalone="yes").

Si queremos referenciar un DTD dentro de este documento XML podemos:

• Incluir dentro del documento una referencia al documento DTD en forma de


URI (Universal Resource Identifier) mediante la siguiente sintaxis:

<!DOCTYPE book SYSTEM "…/DTD/book.dtd">

• Incluir dentro del propio documento el DTD de este modo

<?xml version="1.0"?>
<!DOCTYPE book [
<!ELEMENT book (title+, author+, price+,
publisher+, ISBN+, paperback?)>
<!ELEMENT title (#PCDATA)>
<!ELEMENT author (#PCDATA)>
<!ELEMENT price (#PCDATA)>
<!ATTLIST price coin (dollar|euro) #IMPLIED>
<!ELEMENT publisher (#PCDATA)>
<!ELEMENT ISBN (#PCDATA)>
<!ELEMENT paperback <EMPTY>
]>

9 Programación Orientada a Objetos


XML desde .NET

<book>
<title> Learning to Program the Object-
Oriented Way with C#</title>
<author> Vinny Cahill & Donal
Lafferty</autor>
<price> 63.95$</price>
<publisher> Springer</publisher>
<ISBN> 1852336021</ISBN>
<paperback> 608 pages</paperback>
</book>

Después de la cláusula <!ELEMENT se incluye el nombre del elemento (el que


luego se indicara en la etiqueta), y después si el elemento es no vacío, se indica el
contenido que puede tener el elemento: lista de elementos hijos, tipo de contenido, tipo
de uso se permite hacer de esos elementos dentro del documento, … Si es un elemento
vacío, se indica con la palabra EMPTY.

Para la definición de los atributos, se usa la declaración <!ATTLIST, seguida del


nombre de elemento del que estamos declarando los atributos, el nombre del atributo,
los posibles valores del atributo, …

Este ejemplo se puede representar como un árbol de elementos. Existe un elemento


raíz “book”, que siempre debe ser único y que se llamará como el nombre que se ponga
en la definición del <!DOCTYPE si está asociado a un DTD. Y de él descienden las
ramas de sus respectivos elementos descendientes o hijos: title, author, price, publisher,
ISBN, paperback:

Book

Title Author Price Publisher ISBN Paperback

Figura II: "Estructura de un DTD"

Programación Orientada a Objetos


10
Martín y Vaquero

3. CARACTERÍSTICAS PARA EL USO DE XML Y C#

La información procedente de diferentes servicios suele tener formatos totalmente


distintos de forma que el intercambio de información entre ellos supone un serio
problema. Para salvar este contratiempo en .NET se utiliza el lenguaje XML. Toda la
información que tenga que fluir de un servicio a otro será descrita con XML con el fin
de establecer la correspondencia entre el formato de la información de cada servicio y
los demás. Además, la comunicación entre servicios se realizará utilizando el protocolo
SOAP (Simple Object Access Protocol) que, como es de esperar, también está basado
en XML y que permite invocar métodos, servicios, componentes y objetos de otros
servicios remotos.

SOAP proporciona un mecanismo estándar de empaquetar un mensaje. Un mensaje


SOAP se compone de un sobre que contiene el cuerpo del mensaje y cualquier
información de cabecera que se utiliza para describir el mensaje.

El siguiente ejemplo muestra como una clase envía a otra el estado de un objeto
concreto, en este caso un objeto meeting mediante un mensaje SOAP.

<soap:Envelope xmlns:soap=“http://schemas.xmlsoap.org/soap/envelope/”>
<soap:Header>
<!—Informacion adicional de cabecera. -->
<To>Maite</To>
<From>Mika</From>
</soap:Header>

<soap:Body>
<!– Mensaje: documento XML. -->
<meeting>
<date>29 Abril 2005</date>
<time>11:30</time>
<place>Plaza mayor</place>
</meeting>

</soap:Envelope>

Figura III: "Anatomía de un mensaje SOAP"

11 Programación Orientada a Objetos


XML desde .NET

Si se quiere escribir una aplicación, que trabaje con XML, para la plataforma .NET
el lenguaje de programación utilizado será C# (C sharp) y la forma mas indicada de
manipular los documentos XML será a través de las clases proporcionadas por el propio
framework de .NET debido a su sencillez, su eficiencia y su magnífico soporte de los
estándares actuales. Este framework da soporte para lectura y escritura de documentos
XML, así como para su transformación, filtrado, integración con bases de datos y
creación de servicios Web entre otras tareas más complejas.

Las clases de este framework están disponibles desde varios los espacios de
nombres del sistema. Las clases del núcleo para el trabajo con XML están disponibles
en el espacio de nombres System.Xml.

Espacio de nombres:

Del mismo modo que los ficheros se organizan en directorios, los tipos de datos se
organizan en espacios de nombres.

Por un lado estos espacios permiten tener más organizados los tipos de datos, lo que
facilita su localización. Todas las clases más comúnmente usadas en cualquier
aplicación pertenecen al espacio de nombres llamado System, las de acceso a bases de
datos en System.Data, las de realización de operaciones de entrada/salida en
System.IO, las de manipulación de Documentos XML en System.Xml, etc.

Por otro lado, los espacios de nombres también permiten poder usar en un mismo
programa varias clases con igual nombre si pertenecen a espacios diferentes.

Programación Orientada a Objetos


12
Martín y Vaquero

4. CLASES EN SYSTEM.XML:

XmlReader, XmlWriter, XmlNode, XmlElement, etc. son clases abstractas del


núcleo, todas definen la funcionalidad común que las clases derivadas de ellas deben
soportar.

¾ XmlReader proporciona métodos para el acceso rápido a datos XML, sin


almacenamiento en caché y con desplazamiento solamente adelante.
ƒ XmlTextReader (clase derivada de XmlReader) proporciona la
capacidad de lectura de documentos desde un flujo de texto.

¾ XmlWriter representa un sistema de escritura que proporciona un medio rápido,


sin almacenamiento en caché y con desplazamiento sólo hacia delante para generar
secuencias o archivos con datos XML.
ƒ XmlTextWriter (derivada de XmlWriter) permite escritura de
flujos de texto.

¾ XmlNode proporciona un nodo en un documento XML.


ƒ XmlNodeReader (clase derivada de XmlReader) soporta lectura
de documentos en un árbol DOM (Document Objects Model) en memoria.
ƒ XmlNodeWriter (derivada de XmlWriter) permite escritura en
un árbol DOM en memoria.

¾ XmlElement representa un elemento. La clase XmlElement tiene varios


métodos que le permiten tener acceso a los nodos de atributo
(XmlElement.GetAttribute,XmlElement.SetAttribute, etc.). Además, se puede llamar a
la propiedad XmlElement.Attributes que devuelve una XmlAttributeCollection, que
permite tener acceso a los atributos por nombre o por índice de la colección.

13 Programación Orientada a Objetos


XML desde .NET

¾ XmlAttribute representa un atributo. Los valores válidos y predeterminados del


atributo se definen en una DTD o un esquema.
ƒ AttributeCollection (clase derivada de XmlAttribute) representa
una colección de atributos a los que se puede obtener acceso por nombre o por
índice.

Todas estas clases y otras muchas están agrupadas en la biblioteca System.Xml.dll.


Así pues, si se quieren utilizar las clases del framework de .NET para XML desde C#,
se debe importar el espacio de nombres System.Xml con la ayuda de directivas y a la
hora de compilar el código, se debe pasar “System.Xml.dll” como parámetro a csc.exe.

Programación Orientada a Objetos


14
Martín y Vaquero

5. 1. EJEMPLO: WriteXML

Se desea generar el fragmento de código XML anteriormente visto desde una aplicación
escrita en C#:

Código en C# :
namespace WriteXML
{
using System;
using System.Xml;

public class BookData


{
private const string m_strFileName = "c:\\book.xml";

public static void Main()


{
XmlTextWriter bookWriter = null;
bookWriter = new XmlTextWriter (m_strFileName, null);

try
{
bookWriter.Formatting = Formatting.Indented;
bookWriter.Indentation= 6;
bookWriter.Namespaces = false;

bookWriter.WriteStartDocument();

bookWriter.WriteStartElement("", "book", "");

bookWriter.WriteStartElement("", "title", "");


bookWriter.WriteString("Learning to Program the
Object-Oriented Way with C#");
bookWriter.WriteEndElement();

bookWriter.WriteStartElement("", "author", "");


bookWriter.WriteString("Vinny Cahill & Donal Lafferty ");

bookWriter.WriteEndElement();

bookWriter.WriteStartElement("", " price ", "");


bookWriter.WriteString("63.95");
bookWriter.WriteEndElement();

bookWriter.WriteStartElement("", " publisher ", "");

bookWriter.WriteString("Springer ");
bookWriter.WriteEndElement();

bookWriter.WriteStartElement("", " ISBN ", "");


bookWriter.WriteString("1852336021");
bookWriter.WriteEndElement();

15 Programación Orientada a Objetos


XML desde .NET

bookWriter.WriteStartElement("", " paperback ","");


bookWriter.WriteString("608 pages ");
bookWriter.WriteEndElement();

bookWriter.WriteEndElement();
bookWriter.Flush();
}
catch(Exception e)
{
Console.WriteLine("Exception: {0}", e.ToString());
}
finally
{
if (bookWriter != null)
{
bookWriter.Close();
}
}
}
}
}

Compilación del código:

Ahora solamente se debe guardar el código con extensión .cs, “BookXML.cs” por
ejemplo, y compilar con la siguiente línea de comandos:

csc /r:System.Xml.dll BookXML.cs

Esto producirá el correspondiente fichero “BookXML.exe”, el cual, al ser ejecutado


creará un documento XML llamado “book.xml”.

Estructura del programa:

Lo primero que se observa en el código es la utilización de los espacios de nombres


System y System.Xml que, como se dijo anteriormente, contienen las clases que
utilizaremos para crear el documento XML.

Si durante la ejecución del programa no se produce ninguna excepción, se


ejecutarán todas las instrucciones contenidas entre las llaves de la cláusula try.

Por el contrario, si se produce alguna, se informa por pantalla del suceso.

Finalmente se cierra el acceso al objeto BookWriter.

Programación Orientada a Objetos


16
Martín y Vaquero

Manejo de las clases:

Se declara la clase BookData con un único atributo privado de clase string,


m_strFileName, y un único método público Main.

En éste método se declara un objeto, BookWriter, haciendo uso de la clase


XmlTextWriter que proporciona el framework.

Se crea un primer elemento BookData que será el elemento raíz que contendrá al
resto.

Se crean los diferentes subelementos y se les asignan los diferentes pares etiqueta-
valor, bien sea con la información del estado de un objeto (conjunto de los valores
actuales de sus atributos) o con cualquier otra. De esta forma se puede guardar el estado
de un objeto, (técnica llamada persistencia de los objetos) o bien comunicárselo a otros
objetos o incluso otras aplicaciones mediante el envío de un mensaje SOAP.

17 Programación Orientada a Objetos


XML desde .NET

5.2. EJEMPLO: ReadXML

Código en C# :

namespace ReadXML
{
using System;
using System.Xml;

public class ReadBookAccount


{
private const string m_strFileName = "c:\\book.xml";

public static void Main()


{
XmlTextReader bookReader = null;
bookReader = new XmlTextReader (m_strFileName);

while (bookReader.Read())
{
if (bookReader.NodeType == XmlNodeType.Element){
if (bookReader.LocalName.Equals("title")){
Console.Write("{0} Book Title: ", bookReader.ReadString());
}
if (bookReader.LocalName.Equals("author")) {
Console.WriteLine("{0}", Book author:

bankReader.ReadString() );
}

if (bookReader.LocalName.Equals("price")) {
Console.WriteLine("{0}", Book price: $

bankReader.ReadString())

if (bookReader.LocalName.Equals("publisher")) {
Console.WriteLine("{0}", Book publisher:

bankReader.ReadString());
}

if (bookReader.LocalName.Equals("ISBN")) {
Console.WriteLine("{0}", Book ISBN:

Programación Orientada a Objetos


18
Martín y Vaquero

bankReader.ReadString());
}

if (bookReader.LocalName.Equals("paperback")) {
Console.WriteLine("{0}", Book papaerback:

bankReader.ReadString() pages);
}
}
}

Compilación del código:

Se compilará el código de la misma manera que el anterior. Se obtendrá una salida


por pantalla como esta:

Book title: Learning to Programm the Object-Oriented Way with C#

Book author: Vinny Cahill & Donal Lafferty

Book price: $68.95

Book publisher: Springer

Book ISBN: 1852336021

Book paperback: 608 pages

Estructura del programa:

Se crea un objeto de la clase XmlTextReader indicando el nombre del fichero que


se va a leer: “book.xml”.

Se entra en un bucle de lectura donde se comprueba que cada etiqueta leída


corresponde con la información esperada para, en caso afirmativo, presentarla por
pantalla.

19 Programación Orientada a Objetos


XML desde .NET

6. CONCLUSIONES:

Durante los últimos años XML ha tenido un crecimiento exponencial sobre todo si nos
basamos en sus apariciones en los medios de comunicación de todo tipo, menciones en
páginas web, soporte software, tutoriales, etc. Este lenguaje junto con el paradigma de
orientación a objetos desde la plataforma .NET son el punto base de las aplicaciones
más actuales. Por ello, es necesario conocerlos y relacionarlos.

Gracias al estándar XML se puede guardar el estado de un objeto, o bien


comunicárselo a otros. Así como que otras aplicaciones puedan crear otros objetos a
partir de dicha información con la garantía de que van a poder comprenderlo aunque no
hayan sido diseñados explícitamente para ello.

Por tanto, se guardan los datos independientemente de su presentación en formato


XML para que puedan ser utilizados por otros programas.

Programación Orientada a Objetos


20
Martín y Vaquero

7. ENLACES:

ƒ Página oficial de XML:

www.xml.com

ƒ Tutorial básico de XML:


http://www.dat.etsit.upm.es/~abarbero/curso/xml/xmltutorial.html

ƒ Protocolo SOAP: para que sirve, sus ventajas y la estructura de los


mensajes:
http://www.desarrolloweb.com/articulos/1557.php?manual=54

ƒ XML para programadores de C# :


http://www.perfectxml.com/articles/xml/csharp.asp

ƒ Guardar el estado de un objeto (serialización):


http://msdn.microsoft.com/library/spa/default.asp?url=/library/SPA/cpr
ef/html/frlrfSystemXmlSerialization.asp

ƒ MSDN de Microsoft sobre XML:


http://msdn.microsoft.com/library/spa/default.asp?url=/library/SPA/vsi
ntro7/html/vxorixmlinvisualstudio.asp

21 Programación Orientada a Objetos

Potrebbero piacerti anche