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

Làm cách nào để cập nhật dữ liệu XML theo itemID? Cảm ơn!Cập nhật XML bằng C# bằng cách sử dụng Linq

+1

Tôi không hiểu tại sao các câu hỏi LINQ-to-XML lại phổ biến như vậy vào lúc này. Câu trả lời là _right here_. http://msdn.microsoft.com/en-us/library/bb387087.aspx – Gusdor

Trả lời

4

Truy vấn của bạn đang chiếu lên loại ẩn danh. Nếu bạn muốn chỉ cần sửa đổi các yếu tố bản thân, bạn muốn một cái gì đó như:

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

Nếu không được gọi là:

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

Tôi đề nghị bạn gọi ToList() là tốt, do đó toàn bộ truy vấn được thực hiện và kết quả được lưu trữ trong một danh sách trước khi bắt đầu điều chỉnh:

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

Bạn có thể cung cấp ví dụ đơn giản về gọi toList() để cập nhật xml không? Tôi có cần sử dụng vòng lặp foreach để setElementValue không? –

+1

Gọi ToList() không cập nhật XML, và có, bạn cần sử dụng 'foreach'. Bạn đã không nói làm thế nào bạn muốn cập nhật XML mặc dù, do đó, nó hơi khó để đưa ra một ví dụ. –

+0

Không chắc chắn các tùy chọn để cập nhật tài liệu XML là gì. Có lẽ bạn có thể đề xuất phương pháp hiệu quả nhất. :) –

14

Để cập nhật xml của bạn sử dụng SetElementValue phương pháp của 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: Có, tôi đã thử ví dụ của bạn và lưu dữ liệu đã cập nhật vào tệp. Lưu xml cập nhật của bạn với Save method of the XDocument, đây là đoạn code mà tôi đã cố gắng:

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

Không hoạt động. Có lẽ tôi đang thiếu một cái gì đó. Tôi có phải thêm xmlDoc.Save ("data.xml") không? Ngay cả với xmlDoc.Save, nó vẫn không cập nhật. –

+0

xem câu trả lời cập nhật của tôi. – Canavar

+0

Canavar, tôi đã hy vọng cập nhật tệp xml trực tiếp thay vì phải chuyển đổi nó thành chuỗi trước tiên. cảm ơn! –

5

Để cập nhật sử dụng xml phương pháp phương pháp phần tử của bạn của 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")); 

hoặc

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

bạn lấy mẫu thông tin động và cập nhật những thay đổi đó trong sự kiện bấm nút có nghĩa là, trước tiên bạn kiểm tra mã Tải trang sau có mặt

if(!Page.IsPostBack) { .... } 
Các vấn đề liên quan