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

¿Cómo actualizar los datos XML por ID de elemento? Gracias!Actualizar XML con C# utilizando Linq

+1

No entiendo por qué estas preguntas LINQ-to-XML son tan generalizadas en este momento. Las respuestas son _right here_. http://msdn.microsoft.com/en-us/library/bb387087.aspx – Gusdor

Respuesta

4

Su consulta se está proyectando a un tipo anónimo. Si desea modificar sólo los propios elementos, usted quiere algo como:

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

También conocido como:

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

le sugiero que llame ToList() así, de modo que toda la consulta se lleva a cabo y la los resultados se almacenan en una lista antes de empezar las cosas que modifican:

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

¿Puede proporcionar un ejemplo simple de call toList() para actualizar xml? ¿Debo usar el bucle foreach para setElementValue? –

+1

Llamar a ToList() no actualiza el XML, y sí, necesitarías usar 'foreach'. Sin embargo, no ha dicho cómo desea actualizar el XML, por lo que es un poco complicado dar un ejemplo. –

+0

No estoy seguro de cuáles son las opciones para actualizar un documento XML. Tal vez puedas sugerir el método más eficiente. :) –

14

para actualizar su XML utilizan SetElementValue método de la 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: Sí, he intentado que su ejemplo y se ahorra actualizan los datos en el fichero. Guardar el código XML actualizado con Save method of the XDocument, aquí está el código que he intentado:

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

No funciona. Tal vez me estoy perdiendo algo. ¿Debo agregar xmlDoc.Save ("data.xml")? Incluso con xmlDoc.Save, todavía no se actualiza. –

+0

ver mi respuesta actualizada. – Canavar

+0

Canavar, esperaba actualizar el archivo xml directamente en lugar de tener que convertirlo primero en una cadena. ¡Gracias! –

5

para actualizar su utilización xml método de método de los elementos de la 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")); 

o

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

se obtener información del formulario dinámico y actualizar los cambios en el botón clic en el evento significa, primero se comprueba la carga de la página siguiente código está presente

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