2009-04-15 9 views
31

Comment obtenir un élément XML à partir de XDocument à l'aide de LINQ?Comment obtenir un nœud XML à partir de XDocument

Supposons que j'ai un XDocument nommé XMLDoc qui est indiqué 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 erreur « objet de référence est de ne pas définir ..... »

Comment obtenir un particulier Node d'un fichier XML utilisant LINQ? Et je veux mettre à jour certaines valeurs dans ce noeud?

Comment c'est possible ????

Merci à l'avance .........

Répondre

11

L'opération retourne .elements une liste de XElements - mais ce que vous voulez vraiment est un élément unique. Ajouter ceci:

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 pour vous donner la première (ou NULL, si aucun sont là) de cette liste de XElements vous choisissez.

Marc

+2

Votre modification a rendu clair. Il est en proie à l'erreur classique d'essayer d'utiliser la requête comme jeu de résultats. http://stackoverflow.com/questions/594919/a-question-about-linq-to-sql/594975#594975 Ma réponse à une question similaire –

+0

Salut, Merci pour la réponse. Mais je reçois toujours l'erreur ....... Grâce à cette requête, comment puis-je ajouter de nouveaux nœuds, mettre à jour et supprimer un nœud dans un XDocument ???? –

+1

Si vous voulez ajouter de nouveaux éléments, vous devez saisir le XElement auquel vous souhaitez ajouter quelque chose. Qu'est-ce que tu veux faire? Vous ne pouvez pas tout faire à travers une seule requête ... –

66

Réponse à additional question posté 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 noeud:

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 noeud:

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"); 

Il y a aussi un tutoriel très agréable de parsing XMLs here. J'espère que cela aide.

Questions connexes