Page d'Accueil

Opérations sur des éléments de XML

 

Introduction

Jusqu'ici, pour créer un élément de XML, nous introduisions au clavier directement un fichier. Quand un tel fichier a été créé et sauvé, il est prêt à être traité. Voici un exemple d'un fichier appelé Videos.xml :

<?xml version="1.0" encoding="utf-8" ?>
<Videos>
	<Title>The Distinguished Gentleman</Title>
</Videos>

Dans quelques applications, vous voudrez que l'utilisateur vous fournisse les valeurs nécessaires pour créer un élément. Heureusement, XmlDocument, XmlNode, et les classes XmlElement fournissent toutes les propriétés nécessaires et les méthodes pour effectuer les opérations courantes d'un fichier XML, d'un élément, ou d'un noeud. Les opérations incluent localiser un noeud, ajouter un nouvel élément, ou supprimer un noeud.

Avant d'effectuer une opération, vous devrez habituellement décider dans quelle section du fichier vous voulez que l'action soit appliquée. Comme ça se produit, vous avez le noeud racine, un noeud particulier à l'intérieur du fichier, le parent d'un noeud, les enfants de même parent d'un noeud, etc. Pour obtenir un noeud, vous obtiendrez habituellement d'abord une référence de son XmlElement. Pour ce faire, vous pouvez déclarer une variable XmlElement et l'initialiser avec cette référence.

Étude pratique Étude pratique : Présenter des Opérations sur des Eléments

  1. Commencez Microsoft Visual C# et créez une application de console appelée CollegeParkAutoParts3
  2. Sur le menu principal, cliquez projet - > Ajouter le nouvel article…
  3. Dans les modèles énumérés, cliquez le fichier XML
  4. Placez le nom Makes et cliquez Ajouter
  5. Changez le fichier comme suit :
     
    <?xml version="1.0" encoding="utf-8"?>
    <Makes>
      <Make>Acura</Make>
      <Make>Audi</Make>
      <Make>BMW</Make>
      <Make>Chevrolet</Make>
    </Makes>
  6. Sur le menu principal, cliquez Fichier- > sauvegarder makes.xml Sous…
  7. Accédez au dossier principale du projet en cours et, à intérieur, ouvrez un sous dossier du même nom (il devrait être déjà ouvert). Dans le sous dossier du même nom, ouvrez le sous dossier bin suivie du sous dossier Release. Cliquez sauvegarder
  8. Dans l'explorateur de solution, droit-cliquez CollegeParkAutoParts2 - > ajouter - > nouvel article…
  9. Dans les modèles énumérés, s'assurer que fichier XML est sélectionné.
    Placez le nom Models et cliquez Ajouter
  10. Pour sauvegarder le fichier, sur le menu principal, cliquez Fichier - > Sauvegarder models.xml sous…
  11. Accédez au dossier principale du projet en cours et, à intérieur, ouvrez un sous dossier du même nom (il devrait être déjà sélectionné ). Dans le sous dossier du même nom, ouvrez le sous dossier bin suivie du sous dossier Release. Cliquez sauvegarder
  12. Changez le fichier comme suit :
     
    <?xml version="1.0" encoding="utf-8" ?>
    <Models>
    	<Model>NSX</Model>
    	<Model>TL</Model>
    	<Model>Spider</Model>
    	<Model>A4</Model>
    	<Model>RS6</Model>
    	<Model>323I</Model>
    	<Model>M5</Model>
    	<Model>Astro</Model>
    	<Model>Cavalier</Model>
    	<Model>Prot&#233;g&#233;</Model>
    </Models>

Ajouter un élément vide

Pour vous assister à la création programmatique d'un nouvel élément, la classe XmlDocument fournit la méthode CreateElement () qui est prise en charge dans trois versions. Une des versions utilise la syntaxe suivante :

public XmlElement CreateElement(string name);

En utilisant cette méthode, pour créer un nouvel élément, l'appeler et lui passer le nom de l'élément. Par exemple, vous imaginer vouloir ajouter un nouvel élément de titre au fichier ci-dessus. Vous commenceriez par le code comme suit :

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

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

            if (File.Exists(strFilename))
            {
                xmlDoc.Load(strFilename);

                XmlElement elmNew = xmlDoc.CreateElement("Title");
            }

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

Afin d'ajouter le nouvel élément au fichier, vous devez indiquer sa position dans l'arbre : si ce serait le premier ou le dernier noeud, si vous voulez le placer avant ou après un noeud de votre choix. Par exemple, si vous voulez ajouter un nouvel élément de titre au fichier ci-dessus, on le considérerait comme un enfant de la racine, c'est-à-dire, un enfant de la propriété XmlDocument.DocumentElement. Dans la leçon précédente, nous avons appris comment obtenir une référence du noeud racine.

Pour soutenir les positions des noeuds existants, la classe XmlNode, qui est l'ancêtre de tous les noeuds de XML de .NET Framework, fournit diverses méthodes appropriées. Une de ces méthodes est AppendChild (), qui est utilisée pour ajouter un élément en tant que dernier enfant de son parent. La syntaxe de la méthode XmlNode.AppendChild () est :

public virtual XmlNode AppendChild(XmlNode newChild);

En appelant cette méthode, passer l'objet XmlNode que vous avez fait créer précédent. Après avoir ajouté le noeud, si vous voulez que le fichier le garde, vous devriez le sauvegarder. Voici un exemple :

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

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

            if (File.Exists(strFilename))
            {
                xmlDoc.Load(strFilename);

                XmlElement elmRoot = xmlDoc.DocumentElement;
                XmlElement elmNew = xmlDoc.CreateElement("Title");
                elmRoot.AppendChild(elmNew);
                xmlDoc.Save(strFilename);
            }

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

Ceci produirait :

<?xml version="1.0" encoding="utf-8"?>
<Videos>
  <Title>The Distinguished Gentleman</Title>
  <Title />
</Videos>

Notez que l'élément nouveau supplémentaire est vide.

Ajouter un élément avec sa valeur

Si vous voulez que l'élément ait une valeur, la classe XmlDocument fournit la méthode CreateTextNode (). Cette méthode renvoie une valeur XmlText. La syntaxe de cette méthode est :

public virtual XmlText CreateTextNode(string text);

Cette méthode prend comme argument la chaîne qui constituerait la valeur de l'élément. Avant de l'appeler, vous devriez avoir utilisé la méthode XmlNode.AppendChild () pour créer un noeud. En appelant cette méthode sur le noeud LastChild de celui qui a appelé AppendChild () indiquerait la valeur du nouveau noeud. Voici un exemple :

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

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

            if (File.Exists(strFilename))
            {
                xmlDoc.Load(strFilename);

                XmlElement elmRoot = xmlDoc.DocumentElement;
                XmlElement elmNew = xmlDoc.CreateElement("Title");
                XmlText txtVideo = xmlDoc.CreateTextNode("Basic Instinct");
                elmRoot.AppendChild(elmNew);
                elmRoot.LastChild.AppendChild(txtVideo);

                xmlDoc.Save(strFilename);
            }

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

Ceci produirait :

<?xml version="1.0" encoding="utf-8"?>
<Videos>
  <Title>The Distinguished Gentleman</Title>
  <Title />
  <Title>Basic Instinct</Title>
</Videos>

La combinaison des appels de XmlDocument.CreateElement () et XmlDocument.CreateTextNode () vous permettent de créer un nouvel élément qui a une valeur.

Considérer le fichier suivant :

<?xml version="1.0" encoding="utf-8"?>
<Videos>
  <Video>
    <Title>The Distinguished Gentleman</Title>
  </Video>
  <Video>
    <Title>Basic Instinct</Title>
  </Video>
</Videos>

Notez que la racine, Videos, a un enfant réitéré appelé Video. Cet enfant Video a son propre enfant appelé Title. Imaginez que vous voulez ajouter un nouveau noeud Video qui a un enfant. Pour ce faire, créer d'abord un noeud Video vide en tant qu'enfant de la racine. Nous avons appris plus tôt comment faire cela :

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

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

            if (File.Exists(strFilename))
            {
                xmlDoc.Load(strFilename);

                XmlElement elmRoot = xmlDoc.DocumentElement;
                XmlElement elmNew = xmlDoc.CreateElement("Video");
                elmRoot.AppendChild(elmNew);
            }

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

Après avoir créé le nouvel enfant de la racine, initialiser le grand enfant avec le nom désiré (le nom ne doit pas être l'un des noms existants) et une valeur (qui est facultative si vous ne voulez pas que le nouveau noeud ait une valeur). Une fois que le nouveau noeud est prêt, l'apposer en tant que dernier enfant de la racine. Si ce nouveau noeud a une valeur, apposer son objet XmlText comme LastChild du LastChild de la racine. Voici un exemple de la façon dont vous feriez ceci :

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

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

            if (File.Exists(strFilename))
            {
                xmlDoc.Load(strFilename);

                XmlElement elmRoot = xmlDoc.DocumentElement;
                XmlElement elmNew = xmlDoc.CreateElement("Video");
                elmRoot.AppendChild(elmNew);

                elmRoot = xmlDoc.DocumentElement;

                elmNew = xmlDoc.CreateElement("Title");
                XmlText txtVideo = xmlDoc.CreateTextNode("Her Alibi");
               
                elmRoot.LastChild.AppendChild(elmNew);
                elmRoot.LastChild.LastChild.AppendChild(txtVideo);
                
                xmlDoc.Save(strFilename);
            }

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

Avec ce code vous continuerez ainsi :

<?xml version="1.0" encoding="utf-8"?>
<Videos>
  <Video>
    <Title>The Distinguished Gentleman</Title>
  </Video>
  <Video>
    <Title>Basic Instinct</Title>
  </Video>
</Videos>

À ceci :

<?xml version="1.0" encoding="utf-8"?>
<Videos>
  <Video>
    <Title>The Distinguished Gentleman</Title>
  </Video>
  <Video>
    <Title>Basic Instinct</Title>
  </Video>
  <Video>
    <Title>Her Alibi</Title>
  </Video>
</Videos>

Considérer maintenant le fichier suivant :

<?xml version="1.0" encoding="utf-8"?>
<Videos>
  <Video>
    <Title>The Distinguished Gentleman</Title>
    <Director>Jonathan Lynn</Director>
    <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>
</Videos>

La racine, Videos, a un enfant appelé Video. Le noeud Video a beaucoup de noeuds enfants. À ce jour, nous savons ajouter un enfant à la racine. Nous avons également vu comment ajouter un grand enfant avec la valeur à la racine. Pour ajouter beaucoup (grands) enfants à un noeud, établissez d'abord le noeud, l'ajouter à la racine, ajouter ensuite sans interruption les noeuds nécessaires, un par un, y compris son nom et sa valeur facultative. Ceci serait fait comme suit :

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

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

            if (File.Exists(strFilename))
            {
                xmlDoc.Load(strFilename);

                XmlElement elmRoot = xmlDoc.DocumentElement;
                XmlElement elmNew = xmlDoc.CreateElement("Video");
                elmRoot.AppendChild(elmNew);

                elmRoot = xmlDoc.DocumentElement;

                elmNew = xmlDoc.CreateElement("Title");
                XmlText txtVideo = xmlDoc.CreateTextNode("The Day After Tomorrow");
                elmRoot.LastChild.AppendChild(elmNew);
                elmRoot.LastChild.LastChild.AppendChild(txtVideo);

                elmNew = xmlDoc.CreateElement("Director");
                txtVideo = xmlDoc.CreateTextNode("Roland Emmerich");
                elmRoot.LastChild.AppendChild(elmNew);
                elmRoot.LastChild.LastChild.AppendChild(txtVideo);
                
                elmNew = xmlDoc.CreateElement("Length");
                txtVideo = xmlDoc.CreateTextNode("124 Minutes");
                elmRoot.LastChild.AppendChild(elmNew);
                elmRoot.LastChild.LastChild.AppendChild(txtVideo);
                
                elmNew = xmlDoc.CreateElement("Format");
                txtVideo = xmlDoc.CreateTextNode("DVD");
                elmRoot.LastChild.AppendChild(elmNew);
                elmRoot.LastChild.LastChild.AppendChild(txtVideo);
                
                elmNew = xmlDoc.CreateElement("Rating");
                txtVideo = xmlDoc.CreateTextNode("PG-13");
                elmRoot.LastChild.AppendChild(elmNew);
                elmRoot.LastChild.LastChild.AppendChild(txtVideo);

                xmlDoc.Save(strFilename);
            }

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

 Ceci produirait :

<?xml version="1.0" encoding="utf-8"?>
<Videos>
  <Video>
    <Title>The Distinguished Gentleman</Title>
    <Director>Jonathan Lynn</Director>
    <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>The Day After Tomorrow</Title>
    <Director>Roland Emmerich</Director>
    <Length>124 Minutes</Length>
    <Format>DVD</Format>
    <Rating>PG-13</Rating>
  </Video>
</Videos>

En utilisant la même approche, vous pouvez ajouter des enfants aux enfants des enfants, et ainsi de suite.

Étude pratique Étude pratique : Ajouter Programmaticalement un élément

  1. Pour donner à l'utilisateur la capacité de créer un nouveau Car Make, changez le fichier Program.cs comme suit :
     
    using System;
    using System.Xml;
    
    namespace CollegeParkAutoParts3
    {
        public static class Program
        {
            public static void CreateNewMake()
            {
                string strNewMake = "";
    
                Console.Write("Enter Car Make: ");
                strNewMake = Console.ReadLine();
    
                // Open the Makes.xml file
                XmlDocument docXMLFile = new XmlDocument();
                docXMLFile.Load("Makes.xml");
    
                // Get the root node so we can explore its children
                XmlElement nodRoot = docXMLFile.DocumentElement;
                // Store all the values of the elements in a string
                string allMyChildren = nodRoot.InnerText;
                // Locate the new make among the values of the elements
                int indexLookForNewMake =
                    allMyChildren.IndexOf(strNewMake);
    
                // If the car make exists already, don't add it
                if (indexLookForNewMake >= 0)
                    return;
                else
                {
                    // If the car is not in the list
                    // already, add it as a Make element
                    XmlElement elmXML =
                        docXMLFile.CreateElement("Make");
                    // Create its value using the 
                    // string provided by the user
                    XmlText txtXML = 
                        docXMLFile.CreateTextNode(strNewMake);
                    // Add the new element at the end of the file
                    docXMLFile.DocumentElement.AppendChild(elmXML);
                    // Specify its text
                    docXMLFile.DocumentElement.LastChild.AppendChild(txtXML);
    
                    // Save the file
                    docXMLFile.Save("Makes.xml");
                }
            }
           
            static int Main(string[] args)
            {
                return 0;
            }
        }
    }
  2. Pour donner à l'utilisateur la capacité d'ajouter un nouveau modèle de voiture, créer la fonction suivante dans le fichier :
     
    using System;
    using System.Xml;
    
    namespace CollegeParkAutoParts2
    {
        public static class Program
        {
            public static void CreateNewMake()
            {
                . . . No Change
            }
    
            public static void CreateNewModel()
            {
                string strNewModel = "";
    
                Console.Write("Enter Car Model: ");
                strNewModel = Console.ReadLine();
    
                XmlDocument docXMLFile = new XmlDocument();
                docXMLFile.Load("models.xml");
    
                XmlElement nodRoot = docXMLFile.DocumentElement;
                string allMyChildren = nodRoot.InnerText;
                int indexNewModel =
                    allMyChildren.IndexOf(strNewModel);
    
                if (indexNewModel >= 0)
                    return;
                else
                {
                    XmlElement elmXML =
                        docXMLFile.CreateElement("Model");
                    XmlText txtXML =
                        docXMLFile.CreateTextNode(strNewModel);
    
                    docXMLFile.DocumentElement.AppendChild(elmXML);
                    docXMLFile.DocumentElement.LastChild.AppendChild(txtXML);
    
                    docXMLFile.Save("models.xml");
                }
            }
    
            static int Main(string[] args)
            {
                return 0;
            }
        }
    }
  3. Pour guider l'utilisateur avec un menu, changez le fichier comme suit :
     
    using System;
    using System.Xml;
    
    namespace CollegeParkAutoParts2
    {
        public static class Program
        {
            public static void CreateNewMake()
            {
                . . . No Change
            }
    
            public static void CreateNewModel()
            {
                . . . No Change
            }
    
            static int Main(string[] args)
            {
                char mnuChoice = 'q';
    
                Console.WriteLine("=o=o=o=o=o=o=o=o=o=o=o=o=o=o=o=");
                Console.WriteLine("=-= College Park Auto-Parts =-=");
                Console.WriteLine("=o=o=o=o=o=o=o=o=o=o=o=o=o=o=o=");
    
                do
                {
                    try
                    {
                        Console.WriteLine("=-= Main Menu =-=");
                        Console.WriteLine("1 - Add New Car Make");
                        Console.WriteLine("2 - Add New Car Model");
                        Console.WriteLine("0 - Exit");
                        Console.Write("Your Choice: ");
                        mnuChoice = char.Parse(Console.ReadLine());
                    }
                    catch (FormatException)
                    {
                        Console.WriteLine("Invalid Choice");
                        Console.WriteLine("Please try again");
                    }
    
                    switch (mnuChoice)
                    {
                        case '1':
                            CreateNewMake();
                            break;
                        case '2':
                            CreateNewModel();
                            break;
                        default:
                            break;
                    }
    
                    Console.WriteLine();
                } while((mnuChoice == '1') ||
                        (mnuChoice == '2'));
    
                Console.WriteLine("\nThank you!");
                return 0;
            }
        }
    }
  4. Exécutez l'application et créez les éléments suivants :
     
    Marques
    Détour
    Ford
    Honda
    Toyota
    Modèles
    A4 Quattro
    Corolle
    Le Dakota
    Foyer
    Escorte
    Camry
    Couronne Victoria
    Expédition
    Integra
    Néon
  5. Fermez la fenêtre DOS

Ajouter un élément rempli d'enfant

Le fichier Videos.xml ci-dessus a eu seulement un niveau sous la racine et aucun élément enfant de la racine n'a eu des enfants. Supposer que vous avez la version suivante du fichier :

<?xml version="1.0" encoding="utf-8"?>
<Videos>
  <Video>
    <Title>The Distinguished Gentleman</Title>
    <Director>Jonathan Lynn</Director>
    <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>
</Videos>

Imaginer que vous voulez ajouter un élément Video. Vous avez le choix d'ajouter un, plus, ou tous les éléments enfants du noeud Video. Pour effectuer cette opération, une solution que vous pouvez utiliser est « d'établir » tous les éléments enfants de l'élément Video, puis ajouter le noeud comme un tout. Pour soutenir cette technique, nous avons vu plus tôt que la propriété XmlNode.InnerXml comporte un noeud, son Markup, ses enfants et leur Markups. Ceci signifie que vous pouvez créer les noeuds enfants avec leurs Markups comme chaîne et assigner cette chaîne à une chaîne XmlNode.InnerXml. Pour ce faire, vous auriez besoin de la version set de la propriété InnerXml. On la déclare comme suit :

public virtual string InnerXml{get; set;}

Voici un exemple qui ajoute un nouveau noeud Video complet au fichier XML ci-dessus :

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

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

            if (File.Exists(strFilename))
            {
                xmlDoc.Load(strFilename);

                XmlElement elmXML = xmlDoc.CreateElement("Video");
                string strNewVideo = "<Title>Other People's Money</Title>" +
                                     "<Director>Alan Brunstein</Director>" +
                                     "<Length>114 Minutes</Length>" +
                             	     "<Format>VHS</Format>" +
                             	     "<Rating>PG-13</Rating>";

                elmXML.InnerXml = strNewVideo;
                xmlDoc.DocumentElement.AppendChild(elmXML);

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

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

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