Page d'Accueil

Opérations sur un attribut de XML

 

Introduction

Dans .NET Framework, un attribut est représenté par la classe XmlAttribute. Comme tous les noeuds, cette classe est basée sur la classe XmlNode. Le nom d'un attribut est représenté par sa propriété Name (Read only). La valeur d'un attribut est représentée par sa propriété Value. En plus de Value, vous pouvez également utiliser XmlAttribute.InnerText ou XmlAttribute.InnerXml pour accéder au texte d'un attribut.

Créer manuellement un attribut

Un élément peut avoir 0, un, ou plusieurs attributs. Les attributs d'un élément sont stockés dans la propriété Attributes d'un objet XmlElement. La propriété XmlElement.Attributes est basée sur une classe appelée XmlAttributeCollection. La classe XmlAttributeCollection est basée sur la classe XmlNamedNodeMap.

Avant d'effectuer une opération relative à l'attribut sur un élément, découvrez si l'élément a n'importe quel attribut, vous pouver vérifier la valeur de la propriété booléenne HasAttributes son élément XmlElement. Si cette propriété produit une valeur vraie, alors l'élément a au moins un attribut ; autrement, l'élément n'en a pas.

Tandis qu'un certain élément peut avoir un attribut, un élément enfant de même parent avec le même nom peut ne pas avoir un attribut ou peut avoir un type complètement différent d'attribut. Voici un fichier XML avec des attributs dans quelques éléments :

<?xml version="1.0" encoding="utf-8" ?>
<Videos>
    <Video ISBN="0-7888-1623-3">
	<Title Screenplay="Marty Kaplan">The Distinguished Gentleman</Title>
	<Director>Jonathan Lynn</Director>
	<Actors>
	</Actors>
	<Length>112 Minutes</Length>
	<Format>DVD</Format>
	<Rating>R</Rating>
    </Video>
    <Video>
	<Title WrittenBy="Charlie Peter">Her Alibi</Title>
	<Director>Bruce Beresford</Director>
	<Length>94 Mins</Length>
	<Format>DVD</Format>
	<Rating>PG-13</Rating>
    </Video>
</Videos>

Se rappeler que vous pouvez inclure les espaces blancs pour rendre votre code facile à lire. Ceci signifie que vous pouvez dactylographier un attribut sur la prochaine ligne du nom de son élément. Dans la leçon 36, nous avons vu que chaque élément doit être fermé. Nous avons vu que nous pourrions fermer un élément avec une étiquette de fin comme suit :

<Video><ISBN>0-7888-1623-3</ISBN></Video>

Nous avons également vu que nous pourrions fermer un élément localement comme suit : <Video/>. Si vous créez un attribut dans un élément vide, vous pouvez également le fermer en dactylographiant le slash indicatif avant le guillemet simple droit et après un espace vide. Voici un exemple :

<Video ISBN="0-7888-1623-3" />

Étude pratique Étude pratique : Créer des attributs simples 

  1. Changez le fichier continents.xml comme suit :
     
    <?xml version="1.0" encoding="utf-8" ?>
    <World>
    	<Continent Name="Africa"></Continent>
    	<Continent Name="Europe"></Continent>
    	<Continent Name="Asia"></Continent>
    	<Continent Name="South America"></Continent>
    </World>
  2. Sauvegardez le fichier

 créer Programmaticalement un attribut 

Comme mentionné déjà, un attribut appartient principalement à un élément. Ceci signifie que, en créant un attribut, vous devez indiquer à quel élément il appartiendrait. Pour soutenir les attributs d'un élément, la classe XmlElement est équipée de la méthode SetAttribute () qui a deux versions. La première version de cette méthode utilise la syntaxe suivante :

public virtual void SetAttribute(string name, string value);

Le premier argument est le nom du nouvel attribut et le deuxième argument sera son texte. Avant d'ajouter un attribut, vous devriez d'abord identifier son élément parent. Voici un exemple qui ajoute un attribut à l'élément racine :

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

namespace VideoCollection
{
    public static class Exercise
    {
        private static void CreateAttribute()
	{
            string strFilename = "Videos.xml";
			XmlDocument docXML = new XmlDocument();

            if (File.Exists(strFilename))
            {
                // Open the XML file
                docXML.Load(strFilename);

                // Create an attribute and add it to the root element
                docXML.DocumentElement.SetAttribute("FileDesc",
                                   "Personal Video Collection");
                docXML.Save("Videos.xml");
            }
	}

        static int Main(string[] args)
        {
            CreateAttribute();
            return 0;
        }
    }
}

À partir du fichier Videos.xml ci-dessus, ce code aurait comme conséquence :

<?xml version="1.0" encoding="utf-8"?>
<Videos FileDesc="Personal Video Collection">
  <Video ISBN="0-7888-1623-3">
    <Title Screenplay="Marty Kaplan">The Distinguished Gentleman</Title>
    <Director>Jonathan Lynn</Director>
    <Actors>
    </Actors>
    <Length>112 Minutes</Length>
    <Format>DVD</Format>
    <Rating>R</Rating>
  </Video>
  <Video>
    <Title WrittenBy="Charlie Peter">Her Alibi</Title>
    <Director>Bruce Beresford</Director>
    <Length>94 Mins</Length>
    <Format>DVD</Format>
    <Rating>PG-13</Rating>
  </Video>
</Videos>

Pour soutenir l'addition d'attribut, la classe XmlDocument est équipée de la méthode CreateAttribute (), qui a trois versions. La première version de cette méthode a la syntaxe suivante :

public XmlAttribute CreateAttribute(string name);

Cette méthode s'attend au nom de l'attribut comme argument. Si elle réussit, cette méthode produit un objet XmlAttribute. Pour ajouter le nouvel attribut à un élément, vous pouvez appeler la méthode XmlElement.SetAttributeNote (). Cette méthode a deux versions. Une des versions utilise la syntaxe suivante :

public virtual XmlAttribute SetAttributeNode(XmlAttribute newAttr);

Cette méthode s'attend à un objet XmlAttribute. Voici un exemple qui recherche une vidéo particulière dans une collection et ajoute un attribut ISBN à elle :

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

namespace VideoCollection
{
    public static class Exercise
    {
        private static void CreateAttribute()
		{
            string strFilename = "Videos.xml";
			XmlDocument docXML = new XmlDocument();

            if (File.Exists(strFilename))
            {
                // Open the XML file
                docXML.Load(strFilename);

                // Create a new attribute
                XmlAttribute atrXML = docXML.CreateAttribute("ISBN");
                atrXML.Value = "0-7907-3900-3";

                // Get a list of elements whose names are Video
                XmlNodeList nodVideos = docXML.GetElementsByTagName("Video");
                // Since we will look for a specific video,
		// get the list of all titles
                XmlNodeList nodTitles = docXML.GetElementsByTagName("Title");

                // Visit each title
                for (int i = 0; i < nodTitles.Count; i++)
                {
                    // Look for a video whose title is "Her Alibi"
                    if (nodTitles[i].InnerText.Equals("Her Alibi"))
                    {
                        // Once you find that video, add the new attribute to it
                        ((XmlElement)(nodVideos[i])).SetAttributeNode(atrXML);
                    }
                }

                docXML.Save("Videos.xml");
            }
	}

        static int Main(string[] args)
        {
            CreateAttribute();
            return 0;
        }
    }
}

À partir du fichier Videos.xml, ci-dessus ce code aurait comme conséquence:

<?xml version="1.0" encoding="utf-8"?>
<Videos FileDesc="Personal Video Collection">
  <Video ISBN="0-7888-1623-3">
    <Title Screenplay="Marty Kaplan">The Distinguished Gentleman</Title>
    <Director>Jonathan Lynn</Director>
    <Actors>
    </Actors>
    <Length>112 Minutes</Length>
    <Format>DVD</Format>
    <Rating>R</Rating>
  </Video>
  <Video ISBN="0-7907-3900-3">
    <Title WrittenBy="Charlie Peter">Her Alibi</Title>
    <Director>Bruce Beresford</Director>
    <Length>94 Mins</Length>
    <Format>DVD</Format>
    <Rating>PG-13</Rating>
  </Video>
</Videos>
 

Étude pratique Étude pratique : Créer un attribut

  1. Créez une nouvelle fonction comme suit :
     
    using System;
    using System.IO;
    using System.Xml;
    
    namespace CountriesStatistics1
    {
        public static class Program
        {
            private static void CreateContinent()
            {
                string strFilename = "continents.xml";
                XmlDocument xmlDocContinents = new XmlDocument();
                FileStream fsStatistics = null;
    
                if (File.Exists(strFilename))
                {
                    string strContinent = null;
    
                    try
                    {
                        fsStatistics = new FileStream(strFilename,
                                                      FileMode.Open,
                                                      FileAccess.Read);
                        // Open the XML file
                        xmlDocContinents.Load(fsStatistics);
                    }
                    finally
                    {
                        fsStatistics.Close();
                    }
    
                    // Request the name of a continent from the user
                    Console.Write("Enter the name of a continent: ");
                    strContinent = Console.ReadLine();
    
                    // Create an element that the new attribute will be added to
                    XmlElement xmlNewContinent =
    			 xmlDocContinents.CreateElement("Continent");
    
                    // Create a Continent element and set its value to
                    // that of the new continent
                    xmlNewContinent.SetAttribute("Name", strContinent);
    
                    // Add the element and its attribute to the document
                  xmlDocContinents.DocumentElement.AppendChild(xmlNewContinent);
    
                    // Save the XML file
                    xmlDocContinents.Save("continents.xml");
                }
            }
    
            static int Main(string[] args)
            {
                CreateContinent(); 
                return 0;
            }
        }
    }
  2. Exécutez l'application et créez un continent. Voici un exemple :
     
    Enter the name of a continent: North America
    Press any key to continue . . .
  3. Fermez la fenêtre DOS
     
    <?xml version="1.0" encoding="utf-8"?>
    <World>
      <Continent Name="Africa">
      </Continent>
      <Continent Name="Europe">
      </Continent>
      <Continent Name="Asia">
      </Continent>
      <Continent Name="South America">
      </Continent>
      <Continent Name="North America" />
    </World>

Le parent d'un attribut

Une fois qu'un attribut a été créé, pour identifier l'élément auquel il appartient, vous pouvez accéder à sa propriété XmlAttribute.OwnerElement. Cette propriété produit une valeur XmlElement.

Enlever un attribut

Si un élément a un attribut que vous ne voulez pas ou aue vous n'en avez pas besoin davantage, vous pouvez supprimer cet attribut. Vous avez diverses options, deux sont disponibles à travers la classe XmlElement.

Les attributs d'un objet XmlElement sont considérés stockés dans une liste indexée avec l'attribut le plus à gauche à l'index 0, le second à la gauche à l'index 1, et ainsi de suite. Basé sur ceci, pour enlever un attribut en se bassant sur son index pour le localiser, vous pouvez appeler la méthode XmlElement.RemoveAt (). Sa syntaxe est :

public virtual XmlNode RemoveAttributeAt(int i);

En appelant cette méthode, si un attribut existe à la position i, il sera supprimé et la méthode le renverrait. S'il n'y a aucun attribut à cet index, la méthode ne fait rien et elle renvoie 0.

L'utilisation de la méthode XmlElement.RemoveAt () pour supprimer un attribut peut être incertaine parce que vous ne sauriez pas s'il y a un attribut à la position indiquée. Une alternative est d'indiquer le nom de l'attribut que vous voulez supprimer. Pour soutenir ceci, la classe XmlElement est équipée de la méthode RemoveAttribute (), qui a deux versions. Une des versions de cette méthode utilise la syntaxe suivante:

public virtual void RemoveAttribute(string name);

Cette méthode s'attend comme argument le nom de l'attribut à enlever.

Une autre technique que vous pouvez utiliser consiste à définir un objet XmlAttribute et soumettre à son parent XmlElement pour la suppression. Pour ce faire, vous pouvez appeler la méthode RemoveAttributeNode() objet de XmlElement. Sa syntaxe est :

public virtual XmlAttribute RemoveAttributeNode(XmlAttribute oldAttr);

En appelant cette méthode, passer l'objet attribut comme argument. Si l'attribut existe, il serait enlevé et la méthode renverrait l'attribut supprimé. Si l'attribut n'existe pas, rien ne se produirait.

  

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