2009-07-23 37 views
7

Cách tốt nhất để cập nhật XElement (cập nhật giá trị của itemNumber của phần tử Pen) trong XML này là gì?Tôi làm cách nào để cập nhật XElement cụ thể?

<?xml version="1.0" encoding="utf-8"?> 
<MyStore> 
    <Category> 
    <itemName>Pen</itemName> 
    <itemNumber>12</itemNumber> 
    </Category> 
    <Category> 
    <itemName>Paper</itemName> 
    <itemNumber>23</itemNumber> 
    </Category> 
</MyStore> 

Trả lời

11
XDocument doc; 
... 
XElement penItemValue = doc 
    .Elements("MyStore") 
    .Elements("Category") 
    .Elements("itemName") 
    .Single(itemName => itemName.Value == "Pen") 
    .Parent 
    .Element("itemValue"); 
penItemValue.Value = "123"; 
+0

Tôi gặp sự cố với Elements và Element. Khi đó là Elements, nó đã cho tôi một kết quả rỗng cho các xml ở trên, nhưng tôi đã theo cách tiếp cận của bạn và nhận nó. – paradisonoir

+0

Câu trả lời tuyệt vời! Một vài điều tôi cần làm là tham chiếu System.Linq và System.LinqExpressions trong dự án của tôi. Ngoài ra, VB.NET tương đương với câu lệnh .Single (xxx) là: .Single (Hàm (itemName) itemName.Value = "Pen") – robnick

1

Tôi sẽ sử dụng Xpath để tìm phần tử bạn đang tìm kiếm, sau đó điều khiển trực tiếp.

Đối với một cái gì đó XPath như //Category[itemName='Pen']/itemNumber sẽ tìm thấy những yếu tố for more on Xpath see

Sau đây (rất cơ bản) đoạn mã công trình đối với tôi trong mono

using System.Xml; 

namespace test 
{ 

    class myclass 
    { 

    public static void Main(string[] argv) 
    { 
    XmlTextReader reader = new XmlTextReader(argv[0]); 
    XmlDocument doc = new XmlDocument(); 
    doc.Load(reader); 
    reader.Close();   
    XmlNode myNode; 
    XmlElement root = doc.DocumentElement; 
    myNode = root.SelectSingleNode("//Category[itemName='Pen']/itemNumber"); 

    myNode.InnerText = "18"; 

    doc.Save(argv[1]); 
    } 
} 
} 
3

Bạn có thể tìm thấy nó và cập nhật nó bằng cách sử LinqToXml:

XElement root = XElement.Load("myXml.xml"); 

var penCategory = from category in root.Descendants("Category") 
        where category.Element("itemName") != null 
        && category.Element("itemName").Value == "Pen" 
        select category; 

penCategory.Element("itemName").Value = updatedValue; 
+0

Tại sao bạn sử dụng 'Hậu duệ() 'rất tích cực, trong đó' Elements() 'sẽ làm tốt? –

+0

Thói quen nhiều hơn bất cứ điều gì. – womp

+0

thx, điều này đã giúp :) –

0

Sử dụng XPath (sẽ quen thuộc với hầu hết các nhà phát triển XML):

var xml = @"<?xml version=""1.0"" encoding=""utf-8""?> 
    <MyStore> 
    <Category> 
     <itemName>Pen</itemName> 
     <itemNumber>12</itemNumber> 
    </Category> 
    <Category> 
     <itemName>Paper</itemName> 
     <itemNumber>23</itemNumber> 
    </Category> 
    </MyStore>"; 

    var doc = new XmlDocument(); 
    doc.LoadXml(xml); 
    var nav = doc.CreateNavigator(); 
    var iter = nav.Select("/MyStore/Category[itemName='Pen']/itemNumber"); 
    iter.MoveNext(); 
    iter.Current.SetValue("42"); 
+0

Ông đặc biệt hỏi về việc làm điều này cho 'XElement'. –

Các vấn đề liên quan