2011-03-16 62 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(); 
    }