Обновление 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?
Спасибо!
Ответы
Ответ 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();