Distinction entre XmlNode et XmlElement dans le framework .NET

Lors de la manipulation de documents XML en C#, les développeurs sont souvent confrontés aux classes XmlNode et XmlElement. Bien qu'elles partagent de nombreuses similitudes, comprendre leurs rôles respectifs est essentiel pour une gestion efficace du DOM (Document Object Model).

Hiérarchie et Héritage

La relation entre ces deux classes est basée sur l'héritage : XmlElement dérive de XmlLinkedNode, qui elle-même hérite de XmlNode. En tant que classe enfant, XmlElement possède toutes les propriétés et méthodes de XmlNode, tout en ajoutant des fonctionnalités spécifiques à la gestion des éléments XML.

Différences clés

  • Nature : XmlNode est une classe abstraite représentant n'importe quel type de composant dans un arbre XML (nœud de texte, commentaire, attribut, élément, etc.). À l'inverse, XmlElement est une classe concrète dédiée spécifiquement aux balises de type élément.
  • Instanciation : On ne peut pas créer directement une instance de XmlNode. On utilise généralement CreateNode depuis un objet XmlDocument. Bien que XmlElement soit une classe concrète, son constructeur est protégé ; on l'instancie via la méthode CreateElement de la classe XmlDocument.
  • Gestion des attributs : XmlElement offre des méthodes simplifiées comme SetAttribute, GetAttribute ou RemoveAttribute. Avec XmlNode, la gestion des attributs nécessite de passer par la collection Attributes, ce qui s'avère moins direct pour les opérations courantes.
  • Contenu : Contrairement à une idée reçue, un XmlElement peut contenir des nœuds enfants (ChildNodes), tout comme un XmlNode.

Exemples de création d'éléments

Voici comment générer des instances de XmlElement en utilisant différentes signatures de la classe XmlDocument :

// Initialisation du document
XmlDocument monDoc = new XmlDocument();

// Création simple par nom de balise
XmlElement baliseSimple = monDoc.CreateElement("produit");

// Création avec un préfixe et un namespace URI
XmlElement baliseNamespace = monDoc.CreateElement("p", "titre", "https://www.example.org/schema");

// Utilisation de la méthode générique CreateNode pour obtenir un XmlNode de type Element
XmlNode noeudGenerique = monDoc.CreateNode(XmlNodeType.Element, "item", null);

Cas pratique : Manipulation d'un catalogue

Considérons le fichier XML suivant nommé inventaire.xml :

<?xml version="1.0" encoding="utf-8"?>
<catalogue>
  <article id="101" categorie="electronique">
    <nom>Clavier Mécanique</nom>
    <prix>89.99</prix>
  </article>
  <article id="102" categorie="accessoire">
    <nom>Tapis de souris</nom>
    <prix>15.50</prix>
  </article>
</catalogue>

Le code ci-dessous illustre comment ajouter, modifier et supprimer des données en exploitant les spécificités de XmlElement :

static void EditerXml()
{
    XmlDocument docXml = new XmlDocument();
    docXml.Load("inventaire.xml");
    XmlElement racine = docXml.DocumentElement;

    // 1. Ajout d'un nouvel élément 'Marque' au premier article
    XmlElement marqueElement = docXml.CreateElement("marque");
    marqueElement.InnerText = "Logitech";
    
    XmlNode cible = racine.SelectSingleNode("/catalogue/article[@id='101']");
    if (cible != null)
    {
        cible.AppendChild(marqueElement);
        Console.WriteLine("Après ajout : " + cible.OuterXml);
    }

    // 2. Modification d'un attribut via XmlElement
    if (cible is XmlElement elementArt)
    {
        elementArt.SetAttribute("disponibilite", "en_stock");
        Console.WriteLine("Après modification d'attribut : " + elementArt.OuterXml);
    }

    // 3. Remplacement d'un nœud
    XmlElement infoGarantie = docXml.CreateElement("garantie");
    infoGarantie.InnerText = "2 ans";
    cible.ReplaceChild(infoGarantie, marqueElement);

    // 4. Suppression d'un nœud spécifique
    cible.RemoveChild(infoGarantie);
    Console.WriteLine("Contenu final de l'article : " + cible.InnerXml);
}

Résumé des méthodes utiles de XmlElement

L'utilisation de XmlElement est recommandée dès que l'on traite des balises de données, car elle expose des outils dédiés :

  • GetElementsByTagName : pour récupérer une liste de sous-éléments par leur nom.
  • HasAttribute : pour vérifier rapidement la présence d'une propriété.
  • RemoveAllAttributes : pour nettoyer toutes les métadonnées d'une balise en une seule opération.
  • SetAttributeNode : pour attacher un objet XmlAttribute complexe.

Étiquettes: C# XML XmlDocument XmlElement XmlNode

Publié le 11 août à 16h19