2011-03-16 101 views
2

我有一個XDocument與一些元素/子元素等,我想使每個元素的值UpperCase。UpperCase與LINQ的所有Xml元素值

doc.Descendants().ToList().ForEach(f => f.Value = f.Value.ToUpper()); 

不起作用,因爲它將所有值(如上)連接到父元素中。

+0

作爲一個建議,當你想問一個關於C#的問題時,總是將它標記爲C#。不是C#-2.0,C#-4.0 ... C#!如果問題依賴於版本,您可以添加其他標籤的確切版本,但總是放置C#標籤。沒有人回答你的問題並不是因爲這很困難,而是因爲很多人用最常見的標籤(C#,.NET,LINQ)「過濾」他們看到的問題。如果您將鼠標移動到您現在問題的標籤上,您會看到C#23.7K關注者,LINQ 3.2k關注者以及您的標籤206和3追隨者。巨大差距 :-) – xanatos 2011-03-16 09:36:54

回答

2

LINQ表達式通常不應該修改源的值。他們應該只返回新值(把它們作爲一個過濾器...你把一些東西,不同的東西出來)

foreach (var desc in doc.Descendants()) { 
    var nodes = desc.Nodes().Where(p => p.NodeType == XmlNodeType.Text); 

    foreach (XText node in nodes) { 
     node.Value = node.Value.ToUpper(); 
    } 
} 
0

我這種方式解決了它 - 不知道它的最好的,但它的工作原理。

private void btnConvert_Click(object sender, EventArgs e) 
    { 
     XDocument doc = XDocument.Parse(txtXml.Text); 
     ProcessElement(doc.Elements().First()); 
     txtXml.Text = doc.ToString(SaveOptions.DisableFormatting); 
    } 

    private void ProcessElement(XElement element) 
    { 
     if (element.HasElements) 
      element.Elements().ToList().ForEach(e => ProcessElement(e)); 
     else 
      element.Value = element.Value.ToUpper(); 
    }