Page d'Accueil

Les noeuds enfants d'un noeud

 

Introduction

Comme mentionné déjà, un noeud peut être emboîté à l'intérieur des autres. Un noeud emboîté s'appelle un enfant du noeud emboîtant. Ceci implique également qu'un noeud peut avoir autant d'enfants selon les besoins, leur faisant d'eux des noeuds enfants du noeud parent. Dans notre exemple Videos.xml, les noeudsTitle et Director sont des enfants du noeud Video. Le noeud Video est le parent des noeuds Title et Director.

Une collection de noeuds enfants

Pour soutenir les noeuds enfant d'un noeud particulier, la classe XmlNode est équipée de la propriété ChildNodes. Pour identifier la collection de noeuds enfants d'un noeud, .NET Framework fournit la classe XmlNodeList. Par conséquent, la propriété ChildNodes d'un objet XmlNode est de type XmlNodeList. Cette propriété est déclarée comme suit :

public virtual XmlNodeList ChildNodes{get};

Quand cette propriété est utilisée, elle produit une liste XmlNodeList, qui est une collection de tous les noeuds qui partagent le même parent. Chaque article dans la collection est de type XmlNode. Pour vous donner le nombre de noeuds sur une collection XmlNodeList, la classe est équipée d'une propriété appelée count. Voici un exemple de son utilisation :

XML Nodes
using System;
using System.IO;
using System.Xml;

namespace VideoCollection
{
    class Program
    {
        static int Main(string[] args)
        {
            string strFilename = "Videos.xml";
            XmlDocument xmlDoc = new XmlDocument();

            if (File.Exists(strFilename))
            {
                xmlDoc.Load(strFilename);
                XmlElement elm = xmlDoc.DocumentElement;
                XmlNodeList lstVideos = elm.ChildNodes;

                Console.WriteLine("The root element contains {0} nodes",
                                  lstVideos.Count);
            }
            else
                Console.WriteLine("The file {0} could not be located",
                                  strFilename);

            Console.WriteLine();
            return 0;
        }
    }
}

Ceci produirait :

The root element contains 3 nodes

Press any key to continue . . .

Vous pouvez également utiliser la propriété count dans la boucle for  pour visiter les membres de la collection.

Accès d'un noeud dans une collection

Les enfants d'un noeud, c'est-à-dire, les membres d'une propriété ChildNodes, ou les membres d'une collection XmlNodeList, peuvent être situés chacun près d'un index. Le premier noeud a un index 0, la seconde a un index 1, ainsi de suite. Pour vous donner accès à un noeud de la collection, la classe XmlNodeList est équipée d'une propriété indexée et d'une méthode appelées Item. Tous les deux produisent le même résultat. Par exemple, si un noeud a trois enfants, pour accéder au troisième, vous pouvez appliquer un index 2 à sa propriété indexée. Voici un exemple :

using System;
using System.IO;
using System.Xml;

namespace VideoCollection
{
    class Program
    {
        static int Main(string[] args)
        {
            string strFilename = "Videos.xml";
            XmlDocument xmlDoc = new XmlDocument();

            if (File.Exists(strFilename))
            {
                xmlDoc.Load(strFilename);
                XmlElement elm = xmlDoc.DocumentElement;
                XmlNodeList lstVideos = elm.ChildNodes;

                Console.WriteLine(lstVideos[2]);;
 
            }
            else
                Console.WriteLine("The file {0} could not be located",
                                  strFilename);

            Console.WriteLine();
            return 0;
        }
    }
}

Vous pouvez également utiliser la méthode Item () pour obtenir le même résultat. En utilisant a la boucle for, vous pouvez accéder à chaque noeud et afficher les valeurs de ses enfants comme suit :

using System;
using System.IO;
using System.Xml;

namespace VideoCollection
{
    class Program
    {
        static int Main(string[] args)
        {
            string strFilename = "Videos.xml";
            XmlDocument xmlDoc = new XmlDocument();

            if (File.Exists(strFilename))
            {
                xmlDoc.Load(strFilename);
                XmlElement elm = xmlDoc.DocumentElement;
                XmlNodeList lstVideos = elm.ChildNodes;

                for (int i = 0; i < lstVideos.Count; i++)
                    Console.WriteLine("{0}",lstVideos[i].InnerText );
            }
            else
                Console.WriteLine("The file {0} could not be located",
                                  strFilename);

            Console.WriteLine();
            return 0;
        }
    }
}

Ceci produirait :

The Distinguished GentlemanJonathan Lynn112 MinutesDVDR
Her AlibiBruce Beresford94 MinsDVDPG-13
Chalte ChalteAziz Mirza145 MinsDVDN/R

Press any key to continue . . .

Au lieu d'utiliser la propriété indexée, la classe XmlNodeList met en application l'interface IEnumerable. Ceci vous permet d'utiliser une boucle foreach pour visiter chaque noeud de la collection. Voici un exemple :

using System;
using System.IO;
using System.Xml;

namespace VideoCollection
{
    class Program
    {
        static int Main(string[] args)
        {
            string strFilename = "Videos.xml";
            XmlDocument xmlDoc = new XmlDocument();

            if (File.Exists(strFilename))
            {
                xmlDoc.Load(strFilename);
                XmlElement elm = xmlDoc.DocumentElement;
                XmlNodeList lstVideos = elm.ChildNodes;

                foreach(XmlNode node in lstVideos)
                    Console.WriteLine("{0}", node);
            }
            else
                Console.WriteLine("The file {0} could not be located",
                                  strFilename);

            Console.WriteLine();
            return 0;
        }
    }
}

Ceci produirait :

System.Xml.XmlElement
System.Xml.XmlElement
System.Xml.XmlElement

Press any key to continue . . .

Pour mieux contrôler et manipuler les noeuds d'une collection de noeuds, vous devez pouvoir accéder au noeud désiré. Le XmlNode combiné avec les classes XmlNodeList fournissent divers moyens parvenier à un noeud et de prendre les mesures appropriées.

Le parent d'un noeud

Ce ne sont pas tous les noeuds qui ont des enfants, évidemment. Par exemple, le noeud Title de notre fichier Videos.xml n'a pas d'enfant. Pour découvrir si un noeud a des enfants, vérifier sa propriété booléenne HasChildNodes qui est déclarée comme suit :

public virtual bool HasChildNodes{get};

Si un noeud est un enfant, pour obtenir son parent, vous pouvez accéder à sa propriété ParentNode.

Le premier noeud enfant

Les enfants d'un noeud emboîtant sont également identifiés par leur ordre. Pour notre fichier Videos.xml, la première ligne est appelée le premier enfant du DOM. Ce serait :

<?xml version="1.0" encoding="utf-8"?>

Après avoir identifié ou localisé un noeud, le premier noeud qui le suit immédiatement est désigné sous le nom de son premier enfant. Dans notre fichier Videos.xml, le premier enfant du premier noeud Video est l'élément <Title>The Distinguished Gentleman</Title>. Le premier enfant du deuxième noeud Video> est <Title>Her Alibi</Title>.

Dans .NET Framework, le premier enfant d'un noeud peut être recouvré en accédant à la propriété XmlNode.FirstChild déclarée comme suit :

public virtual XmlNode FirstChild{get};

Dans l'exemple suivant, chaque fois que l'analyseur parvient à un noeud Video, il affiche la valeur de son premier enfant :

using System;
using System.IO;
using System.Xml;

namespace VideoCollection
{
    class Program
    {
        static int Main(string[] args)
        {
            string strFilename = "Videos.xml";
            XmlDocument xmlDoc = new XmlDocument();

            if (File.Exists(strFilename))
            {
                xmlDoc.Load(strFilename);
                XmlElement elm = xmlDoc.DocumentElement;
                XmlNodeList lstVideos = elm.ChildNodes;

                for (int i = 0; i < lstVideos.Count; i++)
                    Console.WriteLine("{0}",
                        lstVideos[i].FirstChild.InnerText );
            }
            else
                Console.WriteLine("The file {0} could not be located",
                                  strFilename);

            Console.WriteLine();
            return 0;
        }
    }
}

Ceci produirait :

The Distinguished Gentleman
Her Alibi
Chalte Chalte

Press any key to continue . . .

Dans cet exemple, nous avons commencé notre analyse sur le noeud racine du document. Parfois, vous devrez considérer seulement un noeud particulier, tel que le premier enfant d'un noeud. Par exemple, vous pouvez vouloir utiliser seulement le premier enfant de la racine. Pour l'obtenir, vous pouvez accéder à la propriété FirstChild de l'objet DocumentElement de DOM. Une fois que vous obtenez ce noeud, vous pouvez alors faire ce que vous jugez nécessaire. Dans l'exemple suivant, seulement les valeurs des noeuds enfant du premier enfant de la racine sont affichés :

using System;
using System.IO;
using System.Xml;

namespace VideoCollection
{
    class Program
    {
        static int Main(string[] args)
        {
            string strFilename = "Videos.xml";
            XmlDocument xmlDoc = new XmlDocument();

            if (File.Exists(strFilename))
            {
                xmlDoc.Load(strFilename);
                XmlNode node = xmlDoc.DocumentElement.FirstChild;
                XmlNodeList lstVideos = node.ChildNodes;

                for (int i = 0; i < lstVideos.Count; i++)
                    Console.WriteLine("{0}",
                        lstVideos[i].InnerText );
            }
            else
                Console.WriteLine("The file {0} could not be located",
                                  strFilename);

            Console.WriteLine();
            return 0;
        }
    }
}

Ceci produirait :

The Distinguished Gentleman
Jonathan Lynn
112 Minutes
DVD
R

Press any key to continue . . .

Considérez la modification suivante du fichier Videos.xml :

<?xml version="1.0" encoding="utf-8" ?>
<Videos>
	<Video>
		<Title>The Distinguished Gentleman</Title>
		<Director>Jonathan Lynn</Director>
		<CastMembers>
			<Actor>Eddie Murphy</Actor>
			<Actor>Lane Smith</Actor>
			<Actor>Sheryl Lee Ralph</Actor>
			<Actor>Joe Don Baker</Actor>
			<Actor>Victoria Rowell</Actor>
		</CastMembers>
		<Length>112 Minutes</Length>
		<Format>DVD</Format>
		<Rating>R</Rating>
	</Video>
	<Video>
		<Title>Her Alibi</Title>
		<Director>Bruce Beresford</Director>
		<Length>94 Mins</Length>
		<Format>DVD</Format>
		<Rating>PG-13</Rating>
	</Video>
	<Video>
		<Title>Chalte Chalte</Title>
		<Director>Aziz Mirza</Director>
		<Length>145 Mins</Length>
		<Format>DVD</Format>
		<Rating>N/R</Rating>
	</Video>
</Videos>

Se rappeler qu'en utilisant for ou une boucle foreach appliqué à une collection XmlNodeList, chaque noeud que vous accédez est un objet complet de XmlNode et peut avoir des enfants. Ceci signifie que vous pouvez plus loin obtenir le noeud ChildNodes de n'importe quel noeud. Voici un exemple qui scanne d'abord les noeuds mais recherche un dont le nom est CastMembers :

using System;
using System.IO;
using System.Xml;

namespace VideoCollection
{
    class Program
    {
        static int Main(string[] args)
        {
            string strFilename = "Videos.xml";
            XmlDocument xmlDoc = new XmlDocument();

            if (File.Exists(strFilename))
            {
                xmlDoc.Load(strFilename);
                // Locate the root node and 
                // get a reference to its first child
                XmlNode node = xmlDoc.DocumentElement.FirstChild;
                // Create a list of the child nodes of 
                // the first node under the root
                XmlNodeList lstVideos = node.ChildNodes;

                // Visit each node
                for (int i = 0; i < lstVideos.Count; i++)
                {
                    // Look for a node named CastMembers
                    if (lstVideos[i].Name == "CastMembers")
                    {
                        // Once/if you find it,
                        // 1. Access its first child
                        // 2. Create a list of its child nodes
                        XmlNodeList lstActors =
                            lstVideos[i].ChildNodes;
                        // Display the values of the nodes
                        for (int j = 0; j < lstActors.Count; j++)
                            Console.WriteLine("{0}",
                                lstActors[j].InnerText);
                    }
                }
            }
            else
                Console.WriteLine("The file {0} could not be located",
                                  strFilename);

            Console.WriteLine();
            return 0;
        }
    }
}

Ceci produirait :

Eddie Murphy
Lane Smith
Sheryl Lee Ralph
Joe Don Baker
Victoria Rowell

Press any key to continue . . .

Comme nous avons appris, un noeud ou un groupe de noeuds peut être emboîté à l'intérieur d'un autre noeud. Quand vous parvener à un noeud, vous pouvez savoir ou découvrir s'il a des enfants. Vous pouvez alors vouloir considérer seulement le premier enfant. Voici un exemple :

using System;
using System.IO;
using System.Xml;

namespace VideoCollection
{
    class Program
    {
        static int Main(string[] args)
        {
            string strFilename = "Videos.xml";
            XmlDocument xmlDoc = new XmlDocument();

            if (File.Exists(strFilename))
            {
                xmlDoc.Load(strFilename);
                // Locate the root node and 
                // get a reference to its first child
                XmlNode node = xmlDoc.DocumentElement.FirstChild;
                // Create a list of the child nodes of 
                // the first node under the root
                XmlNodeList lstVideos = node.ChildNodes;

                // Visit each node
                for (int i = 0; i < lstVideos.Count; i++)
                {
                    // Look for a node named CastMembers
                    if (lstVideos[i].Name == "CastMembers")
                    {
                        // Once/if you find it,
                        // 1. Access its first child
                        // 2. Create a list of its child nodes
                        XmlNodeList lstActors =
                            lstVideos[i].FirstChild.ChildNodes;
                        // Display the value of its first child node
                        for (int j = 0; j < lstActors.Count; j++)
                            Console.WriteLine("{0}",
                                lstActors[j].InnerText);
                    }
                }
            }
            else
                Console.WriteLine("The file {0} could not be located",
                                  strFilename);

            Console.WriteLine();
            return 0;
        }
    }
}

Ceci produirait :

Eddie Murphy

Press any key to continue . . .

Le dernier noeud enfant

Par opposition au premier enfant, le noeud enfant qui précède immédiatement l'étiquette de fin du noeud parent s'appelle le dernier enfant. Pour obtenir le dernier enfant d'un noeud, vous pouvez accéder à sa propriété XmlNode.LastChild qui est déclarée comme suit :

public virtual XmlNode LastChild{get};

Les enfants d'un même noeud parent 

Les noeuds enfants qui sont emboîtés dans un noeud parent et partagent le même niveau sont désigné comme les enfants de même parent (Siblings). Considérez le fichier ci-dessus : Le Director, CastMembers, et Length sont des noeuds enfants du noeud Video mais le noeud Actor n'est pas un enfant du noeud Video. En conséquence, Director, Actors, et Length sont des enfants d'un même parent.

Évidemment, pour obtenir un enfant de même parent, vous devez d'abord avoir un noeud. Pour accéder à l'enfant de même parent d'un noeud, vous pouvez utiliser sa propriété XmlNode.NextSibling, qui est déclarée comme suit :

public virtual XmlNode NextSibling{get};
 
  

Précédent Copyright © 2007-2008, Yevol Suivant