tags:

views:

614

answers:

2
//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)
         {
            ....
         }

How to update XML data by itemID? Thanks!

+1  A: 

Your query is projecting to an anonymous type. If you want to just modify the elements themselves, you want something like:

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

Otherwise known as:

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

I suggest you call ToList() as well, so that the whole query is performed and the results stored in a list before you start modifying things:

var items = xmlDoc.Descendants("item")
                  .Where(item => item.Element("itemID").Value == itemID)
                  .ToList();
Jon Skeet
Can you provide a simple example of call toList() to update xml? Do I need to use the foreach loop to setElementValue?
JM
Calling ToList() doesn't update the XML, and yes, you'd need to use `foreach`. You haven't said how you want to update the XML though, so it's somewhat tricky to give an example.
Jon Skeet
Not sure what are the options for updating a XML document. Maybe you can suggest the most efficient method. :)
JM
+1  A: 

To update your xml use SetElementValue method of the 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 : Yes, I tried your example and it saves updated data to the file. Save your updated xml with Save method of the XDocument, here is the code that I tried :

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");
Canavar
Not working. Maybe I'm missing something. Do I have to add xmlDoc.Save("data.xml")? Even with xmlDoc.Save, it still does not update.
JM
see my updated answer.
Canavar
Canavar, I was hoping to update the xml file directly instead of having to convert it into a string first. thanks!
JM