【问题标题】:XElement.SetElementValue add new line before and after valueXElement.SetElementValue 在值之前和之后添加新行
【发布时间】:2013-02-07 14:02:04
【问题描述】:

我有一个替换 resx 文件中值标签内容的代码。 如果我获取值元素并更改其内容,一切都会按预期工作:

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 为什么要添加这些新行?

【问题讨论】:

  • 为什么重要? :)
  • 因为我为此浪费了 15 分钟,而且我想知道事情是如何运作的 :-)
  • 我知道那种感觉——也许值本身包含“新行标签”试试这个:dataEl.SetElementValue("value", dataEl.Value.Replace("\n",""));
  • 我无法重现此行为 - 两种方法都为 &lt;root&gt;&lt;data&gt;&lt;value&gt;myvalue&lt;/value&gt;&lt;/data&gt;&lt;/root&gt; - &lt;data&gt; &lt;value&gt;myvalue&lt;/value&gt; &lt;/data&gt; 输出相同的结果(这是针对 .NET 4.0)。
  • 我在这里上传了一个 resx 文件:wikiupload.com/G5MV6T26NIJRIC4

标签: c# .net xml linq linq-to-xml


【解决方案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) ?是否要设置父“数据”节点的所有连接文本?

【讨论】:

  • 你是对的,这是一个愚蠢的错字。应该是:dataEl.SetElementValue("value", valueEl.Value);。当然,这段代码不会做任何事情,因为我简化了它以指出问题。谢谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-08-06
  • 1970-01-01
  • 2021-06-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-04-17
相关资源
最近更新 更多