web-dev-qa-db-fra.com

Comment obtenir XML Node à partir de XDocument

Comment obtenir un élément XML à partir de XDocument en utilisant LINQ?

Supposons que j'ai un XMLDoc nommé XDocument qui est illustré ci-dessous:

<Contacts>
       <Node>
           <ID>123</ID>
           <Name>ABC</Name>
       </Node>
       <Node>
           <ID>124</ID>
           <Name>DEF</Name>
       </Node>
</Contacts>

XElement Contacts = from xml2 in XMLDoc.Elements("Contacts").Elements("Node")
                    where xml2.Element("ID").Value == variable
                    select xml2;

Mais je reçois l'erreur "La référence d'objet n'est PAS à définir ....."

Comment obtenir un Node à partir d'un fichier XML en utilisant LINQ? Et je veux mettre à jour certaines valeurs dans ce nœud?

Comment c'est possible ????

Merci d'avance.........

34
Shine S

Réponse à question supplémentaire publiée par OP.

test.xml:

<?xml version="1.0" encoding="utf-8"?>
<Contacts>
  <Node>
    <ID>123</ID>
    <Name>ABC</Name>
  </Node>
  <Node>
    <ID>124</ID>
    <Name>DEF</Name>
  </Node>
</Contacts>

Sélectionnez un seul nœud:

XDocument XMLDoc = XDocument.Load("test.xml");
string id = "123"; // id to be selected

XElement Contact = (from xml2 in XMLDoc.Descendants("Node")
                    where xml2.Element("ID").Value == id
                    select xml2).FirstOrDefault();

Console.WriteLine(Contact.ToString());

Supprimer un seul nœud:

XDocument XMLDoc = XDocument.Load("test.xml");
string id = "123";

var Contact = (from xml2 in XMLDoc.Descendants("Node")
               where xml2.Element("ID").Value == id
               select xml2).FirstOrDefault();

Contact.Remove();
XMLDoc.Save("test.xml");

Ajouter un nouveau nœud:

XDocument XMLDoc = XDocument.Load("test.xml");

XElement newNode = new XElement("Node",
    new XElement("ID", "500"),
    new XElement("Name", "Whatever")
);

XMLDoc.Element("Contacts").Add(newNode);
XMLDoc.Save("test.xml");
69
Ondrej Slinták

L'opération .Elements renvoie une LISTE des XElements - mais ce que vous voulez vraiment, c'est un élément SINGLE. Ajoute ça:

XElement Contacts = (from xml2 in XMLDoc.Elements("Contacts").Elements("Node")
                    where xml2.Element("ID").Value == variable
                    select xml2).FirstOrDefault();

De cette façon, vous dites à LINQ de vous donner le premier (ou NULL, s'il n'y en a pas) de la LISTE des XElements que vous sélectionnez.

Marc

11
marc_s