Подтвердить что ты не робот

Обновление XML с помощью С# с использованием Linq

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

Как обновить XML-данные с помощью ItemID? Спасибо!

4b9b3361

Ответ 1

Чтобы обновить xml, используйте SetElementValue метод 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: Да, я попробовал ваш пример и сохранил обновленные данные в файле. Сохраните обновленный xml с помощью Сохранить метод XDocument, вот код, который я пробовал:

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

Ответ 2

Чтобы обновить метод метода элемента элемента xml для 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"));

или

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

вы получаете динамическую информацию и обновляете эти изменения в событии нажатия кнопки, сначала вы проверяете наличие страницы, на которой находится следующий код

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

Ответ 3

Ваш запрос проецируется на анонимный тип. Если вы хотите просто изменить сами элементы, вам нужно что-то вроде:

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

В противном случае, как:

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

Я предлагаю вам также вызвать ToList(), чтобы весь запрос выполнялся и результаты, хранящиеся в списке, перед тем, как вы начнете изменять:

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