2009-09-28 10 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) 
     { 
      .... 
     } 

Jak zaktualizować dane XML według itemID? Dzięki!Zaktualizuj kod XML za pomocą C#, używając Linq

+1

Nie rozumiem, dlaczego te pytania LINQ-to-XML są tak wszechobecne w tej chwili. Odpowiedzi są tutaj w porządku_. http://msdn.microsoft.com/en-us/library/bb387087.aspx – Gusdor

Odpowiedz

4

Twoje zapytanie wyświetla się w anonimowym typie. Jeśli chcesz po prostu zmodyfikować same elementy, chcesz coś takiego:

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

zwie się:

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

Proponuję zadzwonić ToList(), jak również tak, że cała kwerenda jest wykonywana, a wyniki zapisywane na liście przed rozpoczęciem modyfikujących rzeczy:

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

Czy możesz podać prosty przykład wywołania toList(), aby zaktualizować xml? Czy muszę używać pętli foreach do setElementValue? –

+1

Wywołanie ToList() nie aktualizuje XML i tak, musisz użyć 'foreach'. Nie powiedziałeś jednak, jak chcesz zaktualizować XML, więc podanie przykładu jest dość trudne. –

+0

Nie wiesz, jakie są opcje aktualizacji dokumentu XML. Może możesz zaproponować najbardziej skuteczną metodę. :) –

14

Aby zaktualizować xml używać SetElementValue sposobu 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: Tak, próbowałem swój przykład i oszczędza zaktualizowane dane do pliku. Zapisz swoją zaktualizowaną xml z Save method of the XDocument, tutaj jest kod, który próbowałem:

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

Nie działa. Może coś mi brakuje. Czy muszę dodać xmlDoc.Save ("data.xml")? Nawet z xmlDoc.Save, nadal nie aktualizuje się. –

+0

zobacz moją zaktualizowaną odpowiedź. – Canavar

+0

Canavar, miałem nadzieję zaktualizować plik xml bezpośrednio, zamiast najpierw konwertować go na ciąg znaków. dzięki! –

5

Aby zaktualizować stosować xml METODA elementem 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")); 

lub

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

ty uzyskać dynamiczny formularz informacyjny i zaktualizować te zmiany w zdarzeniach związanych z kliknięciem przycisku, najpierw sprawdza załadowanie strony następujący kod jest obecny

if(!Page.IsPostBack) { .... } 
Powiązane problemy