Enreas
Advertisement

XML de trabajo[]

El siguiente documento XML será utilizado en las secciones de este capítulo:

<?xml version="1.0" encoding="iso-8859-15"?>
<pelicula titulo="Brazil" estreno="1985" minutos="142">
  <direccion>
    <director nombre="Terry" apellidos="Gilliam"/>
  </direccion>
  <produccion>
    <productor nombre="Patrick" apellidos="Cassavetti"/>
    <productor nombre="Arnon" apellidos="Milchan"/>
  </produccion>
  <guion>
    <guionista nombre="Terry" apellidos="Gilliam"/>
    <guionista nombre="Tom" apellidos="Stoppard"/>
    <guionista nombre="Charles" apellidos="McKeown"/>
  </guion>
  <reparto>
    <interprete nombre="Jonathan" apellidos="Pryce"
      papel="protagonista"/>
    <interprete nombre="Robert" apellidos="De Niro"
      papel="protagonista"/>
    <interprete nombre="Kim" apellidos="Greist"
      papel="protagonista"/>
    <interprete nombre="Michael" apellidos="Palin"
      papel="secundario"/>
    <interprete nombre="Ian" apellidos="Holm"
      papel="secundario"/>
    <interprete nombre="Bob" apellidos="Hoskins"
      papel="secundario"/>
  </reparto>
  <esloganes>
    <eslogan>
      Vuelos fantásticos.
      La pesadilla de la realidad.
      Ataques terroristas.
      Compras a media noche.
      Amor verdadero.
      Y fontanería creativa.
    </eslogan>
  </esloganes>
</pelicula>

Carga de un documento XML[]

El siguiente programa sirve para cargar un documento XML:

using System;
using System.Xml;

class MainClass
{
  public static void Main(string[] args)
  {
    
    string sRuta = "C:\\XML\\";
    // string sRuta = "/home/enreas/andy/XML/";
    
    try{
      
      XmlDocument doc = new XmlDocument();
      doc.PreserveWhitespace = true;
      doc.Load(sRuta + "brazil.xml");
      Console.Write(doc.InnerXml);
      
    }
    
    catch(Exception e){
        
      Console.WriteLine("Error: '{0}'", e);
        
    }    

  }
}

Dependiendo de si se utiliza Windows o Linux, será necesario cambiar el comentario de las líneas en las que se asigna un valor a sRuta.

Movimiento en vertical[]

El movimiento en vertical es uno de los más utilizados. Dado un determinado nodo, mediante una serie de métodos podemos acceder a sus hijos y, a partir de ahí, a los hijos de estos y así sucesivamente. El siguiente es un ejemplo de ello:

using System;
using System.Xml;

class MainClass
{
  public static void Main(string[] args)
  {

    string sRuta = "C:\\XML\\";
    // string sRuta = "/home/enreas/andy/XML/";

    try{

      XmlDocument doc = new XmlDocument();
      // doc.PreserveWhitespace = true;
      doc.Load(sRuta + "Brazil.xml");
      
      foreach(XmlNode nodo in doc.DocumentElement.ChildNodes){

        Console.WriteLine(nodo.Name);

      }

    }

    catch(Exception e){

      Console.WriteLine("Error: '{0}'", e);

    }

  }
}

El resultado: la lista de elementos de primer nivel que componen el documento XML. De igual forma, podemos mostrar también los nombres de los elementos de segundo nivel, es decir, los hijos de los elementos anteriores:

using System;
using System.Xml;

class MainClass
{
  public static void Main(string[] args)
  {

    string sRuta = "C:\\XML\\";
    // string sRuta = "/home/enreas/andy/XML/";

    try{

      XmlDocument doc = new XmlDocument();
      doc.Load(sRuta + "Brazil.xml");
      
      foreach(XmlNode nodo in doc.DocumentElement.ChildNodes){

        Console.WriteLine(nodo.Name);

        foreach(XmlNode nodo2 in nodo.ChildNodes){
          
          Console.WriteLine("\t" + nodo2.Name);

        }

      }
      
      // Console.Write(doc.InnerXml);

    }

    catch(Exception e){

      Console.WriteLine("Error: '{0}'", e);

    }

  }
}

Y así, sucesivamente.

Movimiento en horizontal[]

Además de en vertical (de padres a hijos) también es posible moverse en horizontal (entre hermanos). El siguiente es un ejemplo de este tipo de movimiento:

using System;
using System.Xml;

class MainClass
{
  public static void Main(string[] args)
  {

    string sRuta = "C:\\XML\\";
    // string sRuta = "/home/enreas/andy/XML/";

    try{

      XmlDocument doc = new XmlDocument();
      doc.Load(sRuta + "Brazil.xml");

      XmlNode nodo = doc.DocumentElement.FirstChild;
      
      do{
      
        Console.WriteLine(nodo.Name);
        nodo = nodo.NextSibling;
      
      }while(nodo != null);
      
    }

    catch(Exception e){

      Console.WriteLine("Error: '{0}'", e);

    }

  }
}

Propiedades de los nodos[]

Gracias al uso de DOM podemos obtener las propiedades de cada nodo. Por ejemplo, las siguientes:

  • Attributes.
  • BaseURI.
  • HasChildNodes.
  • InnerText.
  • InnerXml.
  • Name.
  • NodeType.
  • OuterXml.
  • ParentNode.
  • Value.

Podemos ver cómo obtener sus valores en el siguiente ejemplo:

using System;
using System.Xml;

class MainClass
{
  public static void Main(string[] args)
  {

    string sRuta = "C:\\XML\\";
    // string sRuta = "/home/enreas/andy/XML/";

    try{

      XmlDocument doc = new XmlDocument();
      doc.Load(sRuta + "brazil.xml");
      // doc.Load("http://enreas.com/brazil.xml");
      
      foreach(XmlNode nodo in doc.DocumentElement){
      
        if(nodo.Name == "reparto"){
      
          Console.WriteLine("BaseURI: " + nodo.BaseURI);
          Console.WriteLine("HasChildNodes: " +
            nodo.HasChildNodes);
          Console.WriteLine("InnerText: " + nodo.InnerText);
          Console.WriteLine("InnerXml: " + nodo.InnerXml);
          Console.WriteLine("Name: " + nodo.Name);
          Console.WriteLine("NodeType: " + nodo.NodeType);
          Console.WriteLine("OuterXml: " + nodo.OuterXml);
          Console.WriteLine("ParentNode: " +
            nodo.ParentNode.Name);
      
        }
      
      }
      
    }

    catch(Exception e){

      Console.WriteLine("Error: '{0}'", e);

    }

  }
}

Acceso directo[]

Es posible acceder a un elemento en concreto dentro de un documento XML y mostrar sus propiedades. El siguiente ejemplo muestra cómo hacerlo con el elemento /pelicula/reparto:

using System;
using System.Xml;

class MainClass
{
  public static void Main(string[] args)
  {

    string sRuta = "C:\\XML\\";
    // string sRuta = "/home/enreas/andy/XML/";

    try{

      XmlDocument doc = new XmlDocument();
      doc.Load(sRuta + "brazil.xml");
      // doc.Load("http://enreas.com/brazil.xml");
      
      XmlNode nodo = doc.DocumentElement.SelectSingleNode("/pelicula/reparto");
      
      Console.WriteLine("BaseURI: " + nodo.BaseURI);
      Console.WriteLine("HasChildNodes: " + nodo.HasChildNodes);
      Console.WriteLine("InnerText: " + nodo.InnerText);
      Console.WriteLine("InnerXml: " + nodo.InnerXml);
      Console.WriteLine("Name: " + nodo.Name);
      Console.WriteLine("NodeType: " + nodo.NodeType);
      Console.WriteLine("OuterXml: " + nodo.OuterXml);
      Console.WriteLine("ParentNode: " + nodo.ParentNode.Name);
      
    }

    catch(Exception e){

      Console.WriteLine("Error: '{0}'", e);

    }

  }
}

Enlaces interesantes[]

Puede que encuentres interesantes los siguientes enlaces:

Advertisement