C# Language Modifier un fichier XML


Exemple

Pour modifier un fichier XML avec XDocument , vous devez charger le fichier dans une variable de type XDocument , le modifier en mémoire, puis l'enregistrer, en remplaçant le fichier d'origine. Une erreur courante consiste à modifier le XML en mémoire et à attendre que le fichier sur le disque change.

Étant donné un fichier XML:

<?xml version="1.0" encoding="utf-8"?>
<FruitBasket xmlns="http://www.fruitauthority.fake">
  <Fruit>
    <FruitName>Banana</FruitName>
    <FruitColor>Yellow</FruitColor>
  </Fruit>
  <Fruit>
    <FruitName>Apple</FruitName>
    <FruitColor>Red</FruitColor>
  </Fruit>
</FruitBasket>

Vous voulez modifier la couleur de la banane en marron:

  1. Nous devons connaître le chemin d'accès au fichier sur le disque.
  2. Une surcharge de XDocument.Load reçoit un URI (chemin de fichier).
  3. Étant donné que le fichier xml utilise un espace de noms, nous devons interroger avec le nom de l'élément ET de l'espace de noms.
  4. Une requête Linq utilisant la syntaxe C # 6 pour tenir compte de la possibilité de valeurs nulles. Chaque . utilisé dans cette requête peut retourner un ensemble nul si la condition ne trouve aucun élément. Avant C # 6, vous le feriez en plusieurs étapes, en vérifiant la valeur null en cours de route. Le résultat est l'élément <Fruit> qui contient la banane. En fait, un IEnumerable<XElement> , c'est pourquoi l'étape suivante utilise FirstOfDefault() .
  5. Maintenant, nous extrayons l'élément FruitColor de l'élément Fruit que nous venons de trouver. Ici, nous supposons qu'il n'y en a qu'un, ou que nous nous préoccupons uniquement du premier.
  6. Si ce n'est pas nul, nous définissons FruitColor sur "Brown".
  7. Enfin, nous sauvegardons le XDocument , en écrasant le fichier d'origine sur le disque.
// 1.
string xmlFilePath = "c:\\users\\public\\fruit.xml";

// 2.
XDocument xdoc = XDocument.Load(xmlFilePath);

// 3.
XNamespace ns = "http://www.fruitauthority.fake";

//4. 
var elBanana = xdoc.Descendants()?.
    Elements(ns + "FruitName")?.
    Where(x => x.Value == "Banana")?.
    Ancestors(ns + "Fruit");

// 5.
var elColor = elBanana.Elements(ns + "FruitColor").FirstOrDefault();

// 6.
if (elColor != null)
{
    elColor.Value = "Brown";
}

// 7.
xdoc.Save(xmlFilePath);

Le fichier ressemble maintenant à ceci:

<?xml version="1.0" encoding="utf-8"?>
<FruitBasket xmlns="http://www.fruitauthority.fake">
  <Fruit>
    <FruitName>Banana</FruitName>
    <FruitColor>Brown</FruitColor>
  </Fruit>
  <Fruit>
    <FruitName>Apple</FruitName>
    <FruitColor>Red</FruitColor>
  </Fruit>
</FruitBasket>