2013-02-07 36 views
0

我有一个代码,用于替换resx文件中值标记的内容。 如果我取价值元素,并更改其内容一切正常:XElement.SetElementValue在值前后添加新行

foreach (XElement dataEl in doc.Root.Descendants("data")) 
{ 
    XElement valueEl = dataEl.Element("value"); 
    valueEl.Value = valueEl.Value; 
    Console.WriteLine(dataEl); 
} 

结果:

... 
<value>myvalue</value> 
... 

但设定值有:

dataEl.SetElementValue("value", dataEl.Value); 

结果:

... 
<value> 
myvalue 
</value> 
... 

为什么SetElementValue添加这些新行?

+2

为什么这很重要? :) –

+0

因为我失去了15分钟,因为我想知道如何工作:-) – Filip

+0

我知道这种感觉 - 也许价值本身包含“新行标签” 试试这个: 'dataEl.SetElementValue(“value ”,dataEl.Value.Replace( “\ n”, “”));' –

回答

1

来自MSDN的XElement.Value:获取或设置此元素的连接文本内容。

因此,dataEl.Value返回在“数据”节点内找到的所有文本。在这种情况下,只有“value”子节点存在,因此它返回它的文本,但理论上你可以有其他的子节点,如“value2”。

在这种情况下,您最终会得到“myvalue”+ newline +“myvalue2”,这似乎是.net中的默认实现,并且我认为如果您只有一个孩子,它也会使用此换行符。

在另一方面: XElement valueEl = dataEl.Element("value");

valueEl没有任何子元素等等valueEl.Value只是一个字符串。

为什么要使用dataEl.SetElementValue(“value”,dataEl.Value)?你想设置父“数据”节点的所有连接文本吗?

+0

你是对的,这是一个愚蠢的错字。它应该是:'dataEl.SetElementValue(“value”,valueEl.Value);'。当然,这个代码不会做任何事情,因为我简化它来指出问题。谢谢。 – Filip