|
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.
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.
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.
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, Yevol | Suivant |
|
|
||