70-528. Resumen. XML

Cuarta parte del resumen sobre el temario para el examen de certificación 70-528 para desarrollo web.


Clases XML (Todas en System.Xml en System.Xml.dll)

XPathNavigator
XmlDocument
XmlDataDocument
XPathDocument
XslTransform
XmlTextReader
XmlTextWriter

XmlDataDocument hereda de XmlDocument

DTD (Document Type Definition): Documento que contiene el esquema de un documento Xml. (http://en.wikipedia.org/wiki/Document_Type_Definition o http://es.wikipedia.org/wiki/Document_Type_Definition)

XSD (Xml Schema Definition): Es algo así como una nueva versión de DTD, más completa. Recomendad por W3C. (http://en.wikipedia.org/wiki/XML_Schema o http://es.wikipedia.org/wiki/XML_Schema)

XDR (Xml Data Reduced) es otro formato de definición de esquemas para Xml.

XSL, XSLT (Extensible StyleSheet Languaje)  Lenguaje que permite realizar transformaciones sobre documentos XML.

 

XPathDocument es una cache de sólo lectura que viene bien para usar con consultas XPath.

XmlConver es una clase con un montón de métodos estáticos que permiten realizar conversiones de datos acordes con estándares Xml.

XPathNavigator, permite recorrer un documento Xml de manera eficiente usando consultas XPath.

XmlNodeReader: Permite un acceso secuencial (forward-only) para recorrer un documento a partir de un nodo determinado.

XmlTextReader: Proporciona acceso secuencial (no chacheado) a un documento xml.

XmlTextWriter: Proporciona acceso secuencial, no chacheado para la escritura de documentos xml.

XmlReader: Permite leer y validar contenido  conforme a un DTD, XDR o XSD.

XslTransform: Permite transformar un documento Xml a partir de lo especificado en otro XSL.

Crear un documento Xml desde cero. (Código autoexplicativo, es que, está claro que es mucho más entretenido leer código, que un documento)

// Instancia de un nuevo XmlDocumnent
XmlDocument xmlDoc = new XmlDocument();
// Crear la declaración del tipo de documento
xmlDoc.AppendChild(xmlDoc.CreateXmlDeclaration("1.0", "utf-8", null));
// crear el nodo raíz
XmlElement rootNode = xmlDoc.CreateElement("Clientes");
// anexarlo al documento
xmlDoc.AppendChild(rootNode);
// Ahora, anexar cada uno de los clientes
for (int i = 0; i < 5; i++)
{
    // Un element para cada cliente
    XmlElement customerElement = xmlDoc.CreateElement("Cliente");
    // El id, lo estableceremos como atributo del elemento
    XmlAttribute idAttribute = xmlDoc.CreateAttribute("Id");
    // cada atributo debe tener un valor
    idAttribute.Value = i.ToString("000");
    // y cada atributo con su padre elemento
    customerElement.Attributes.Append(idAttribute);
    // El nombre en cambio,lo anexaremos como sub elemento de Cliente
    XmlElement nameElement = xmlDoc.CreateElement("Nombre");
    // Los sub elementos pueden a su vez tener atributos
    // o bien, almacenar el valor en como texto en medio de las
    // etiquetas de apertura y cierre del elemento
    nameElement.InnerText = string.Format("Nombre cliente {0}", i.ToString("000"));
    // cada sub-elemento con su padre elemento
    customerElement.AppendChild(nameElement);
    // y cada elemento, a su nodo raíz
    rootNode.AppendChild(customerElement);
}
// Guardar el documento
string fileName = "..\\..\\Customers.xml";
xmlDoc.Save(fileName);

El código de arriba, genera el siguiente documento xml:

<?xml version="1.0" encoding="utf-8"?>
<Clientes>
  <Cliente Id="000">
    <Nombre>Nombre cliente 000</Nombre>
  </Cliente>
  <Cliente Id="001">
    <Nombre>Nombre cliente 001</Nombre>
  </Cliente>
  <Cliente Id="002">
    <Nombre>Nombre cliente 002</Nombre>
  </Cliente>
  <Cliente Id="003">
    <Nombre>Nombre cliente 003</Nombre>
  </Cliente>
  <Cliente Id="004">
    <Nombre>Nombre cliente 004</Nombre>
  </Cliente>
</Clientes>

Recorriendo un documento Xml mediante DOM.
Ahora, el ejemplo opuesto. Dado un documento Xml, ¿podemos recorrerlo y extraer información acerca de él?

Usaremos el xml de Clientes, generado en el ejemplo anterior. Intentaremos copiar los datos a un DataTable (lo cual es una soberana tontería, ya que el DataTable viene con un método que permite cargar datos y estructura desde un xml)

XmlDocument xmlDoc = new XmlDocument();
string fileName = "..\\..\\Customers.xml";
// Cargamos el documento xml desde el fichero
xmlDoc.Load(fileName);
// generamos el DataTable en el que cargaremos los datos del xml
DataTable customersTable = new DataTable("Clientes");
// Configuramos el datatable, le agregamos las columnas, etc.
customersTable.Columns.Add(new DataColumn("Id", typeof(int)));
customersTable.Columns.Add(new DataColumn("Nombre"));
// Recorremos los hijos del nodo raíz
foreach (XmlElement element in xmlDoc.DocumentElement.ChildNodes)
{
    // cada element, es un cliente, y debe tener un atributo llamado id
    string id = element.Attributes["Id"].Value;
    // cada element cliente, tenía un sub-elelement con el nombre
    XmlNodeList childNodes = element.GetElementsByTagName("Nombre");
    string nombre = childNodes[0].InnerText;
    // agregamos la informaciónj obtenida al datatable
    customersTable.Rows.Add(new object[] { XmlConvert.ToInt64(id),nombre });
}

Qué Datatable genera esto?

image 

El ejemplo anterior lo podemos realizar con la clase XPathNavigator. La ventaja de usar esta clase es que el recorrido es mucho mas óptimo, y consume menos recursos.

XmlDocument xmlDoc = new XmlDocument();
string fileName = "..\\..\\Customers.xml";
// Cargamos el documento xml desde el fichero
xmlDoc.Load(fileName);
// generamos el DataTable en el que cargaremos los datos del xml
DataTable customersTable = new DataTable("Clientes");
// Configuramos el datatable, le agregamos las columnas, etc.
customersTable.Columns.Add(new DataColumn("Id", typeof(int)));
customersTable.Columns.Add(new DataColumn("Nombre"));
// Creamos el objeto xPathNavigator
XPathNavigator xPathNav = xmlDoc.CreateNavigator();
// Al crearlo, estamos en el rootNode.
// Por lo tanto, nos desplazaremos al primer elemento
xPathNav.MoveToFirstChild();
// El primer elemento será el document element "Clientes" en
// nuestro caso, con lo cual necesitamos volver a 
// desplazarnos esta vez hasta el primer elemento "Cliente"
xPathNav.MoveToFirstChild();
// en este punto, estamos en el primer cliente
do
{
    // Recordemos que cliente, almacena su id como atributo
    xPathNav.MoveToFirstAttribute();
    int id = xPathNav.ValueAsInt;
    // Y el nombre estaba como sub-elemento
    // Antes de ver los sub-elementos, hay que volver atrás.
    // Recordemos que ahora mismo estamos sobre el atributo
    xPathNav.MoveToParent();
    // ahora volvemos a estar sobre Cliente
    // Ya nos podemos desplazar al primer hijo, que será
    // el nombre
    xPathNav.MoveToFirstChild();
    string nombre = xPathNav.Value;
    // agregamos la informaciónj obtenida al datatable
    customersTable.Rows.Add(new object[] { id, nombre });
    // antes de iterar al siguiente cliente, habrá que
    // volver al padre
    xPathNav.MoveToParent();
} 
// intentamos movernos al siguiente nodo, y si lo conseguimos, 
// volvemos a repetir el proceso
while (xPathNav.MoveToNext());
Filed under: ,

Comments

No Comments