2009-09-28 9 views
12
//MY XML FILE STRUCTURE 
    <items> 
     <item> 
     <itemID>1</itemID> 
     <isGadget>True</isGadget> 
     <name>Star Wars Figures</name> 
     <text1>LukeSkywalker</text1> 
     </item> 
    </items> 
//TO READ DATA FROM XML BY ITEMID 
XDocument xmlDoc = XDocument.Load(HttpContext.Current.Server.MapPath("data.xml")); 
var items = from item in xmlDoc.Descendants("item") 
      where item.Element("itemID").Value == itemID 
      select new 
      { 
       itemID = item.Element("itemID").Value, 
       isGadget = bool.Parse(item.Element("isGadget").Value), 
       name = item.Element("name").Value, 
       text1 = item.Element("text1").Value, 
      } 
     foreach (var item in items) 
     { 
      .... 
     } 

Comment mettre à jour les données XML par itemID? Merci!Mise à jour de XML avec C# en utilisant Linq

+1

Je ne comprends pas pourquoi ces questions LINQ-to-XML sont si omniprésentes pour le moment. Les réponses sont _right here_. http://msdn.microsoft.com/en-us/library/bb387087.aspx – Gusdor

Répondre

4

Votre requête est en cours de projection vers un type anonyme. Si vous voulez simplement modifier les éléments eux-mêmes, vous voulez quelque chose comme:

var items = from item in xmlDoc.Descendants("item") 
      where item.Element("itemID").Value == itemID 
      select item; 

Autrement connu comme:

var items = xmlDoc.Descendants("item") 
        .Where(item => item.Element("itemID").Value == itemID); 

Je vous suggère d'appeler ToList() aussi bien, de sorte que toute requête est effectuée et la les résultats stockés dans une liste avant de commencer les choses: la modification

var items = xmlDoc.Descendants("item") 
        .Where(item => item.Element("itemID").Value == itemID) 
        .ToList(); 
+0

Pouvez-vous fournir un exemple simple de call toList() pour mettre à jour xml? Ai-je besoin d'utiliser la boucle foreach pour setElementValue? –

+1

L'appel à ToList() ne met pas à jour le XML, et oui, vous devez utiliser 'foreach'. Vous n'avez pas dit comment vous voulez mettre à jour le XML, donc c'est un peu difficile de donner un exemple. –

+0

Vous ne savez pas quelles sont les options de mise à jour d'un document XML. Peut-être que vous pouvez suggérer la méthode la plus efficace. :) –

14

Pour mettre à jour votre méthode xml utiliser SetElementValue du XElement:

var items = from item in xmlDoc.Descendants("item") 
    where item.Element("itemID").Value == itemID 
    select item; 

foreach (XElement itemElement in items) 
{ 
    itemElement.SetElementValue("name", "Lord of the Rings Figures"); 
} 

EDIT: Oui, j'ai essayé votre exemple et il enregistre les données mises à jour dans le fichier. Enregistrez votre xml mis à jour avec Save method of the XDocument, voici le code que j'ai essayé:

string xml = @"<items> 
      <item> 
      <itemID>1</itemID> 
      <isGadget>True</isGadget> 
      <name>Star Wars Figures</name> 
      <text1>LukeSkywalker</text1> 
      </item> 
     </items>"; 

XDocument xmlDoc = XDocument.Parse(xml); 

var items = from item in xmlDoc.Descendants("item") 
      where item.Element("itemID").Value == "1" 
      select item; 

foreach (XElement itemElement in items) 
{ 
    itemElement.SetElementValue("name", "Lord of the Rings Figures"); 
} 

xmlDoc.Save("data.xml"); 
+0

Ne fonctionne pas. Peut-être qu'il me manque quelque chose. Dois-je ajouter xmlDoc.Save ("data.xml")? Même avec xmlDoc.Save, il ne se met toujours pas à jour. –

+0

voir ma réponse mise à jour. – Canavar

+0

Canavar, j'espérais mettre à jour le fichier xml directement au lieu d'avoir à le convertir en chaîne en premier. Merci! –

5

Pour mettre à jour votre méthode de méthode des éléments d'utilisation xml du XElement:

XDocument xmlDoc = XDocument.Load(HttpContext.Current.Server.MapPath("data.xml")); 
var items = (from item in xmlDoc.Descendants("item") 
      where item.Element("itemID").Value == itemID 
      select item).ToList(); 
     foreach (var item in items) 
     { 
       item.Element("itemID").Value=NewValue; 
       bool.Parse(item.Element("isGadget").Value)=Newvalue; 
       item.Element("name").Value=Newvalue; 
       item.Element("text1").Value=Newvalue; 
     } 
xmlDoc.Save(HttpContext.Current.Server.MapPath("data.xml")); 

ou

XDocument xmlDoc = XDocument.Load(HttpContext.Current.Server.MapPath("data.xml")); 
      foreach (var item in (from item in xmlDoc.Descendants("item") 
       where item.Element("itemID").Value == itemID 
       select item).ToList()) 
      { 
        item.Element("itemID").Value=NewValue; 
        bool.Parse(item.Element("isGadget").Value)=Newvalue; 
        item.Element("name").Value=Newvalue; 
        item.Element("text1").Value=Newvalue; 
      } 
    xmlDoc.Save(HttpContext.Current.Server.MapPath("data.xml")); 
vous

obtenir le formulaire d'information dynamique et mettre à jour ces changements dans les moyens d'événement de clic de bouton, d'abord vous vérifiez le chargement de la page suivant le code est présent

if(!Page.IsPostBack) { .... } 
Questions connexes