OITA: Oika's Information Technological Activities

@oika 情報技術的活動日誌。

Mono実行下でXElement.SetElementValueにバグ

.NET 4.0のアプリで、Monoを使ってLinuxで動かしたときに
たまたまMonoのバグがあってはまったのでメモ。
LINQ to XMLの話になるのかな。

<Root>
  <Elm1>12345</Elm1>
  <Elm2>12345</Elm2>
  <Elm3>12345</Elm3>
</Root>

↑みたいなXMLを作って、XElement.SetElementValueで
1つの要素の値を更新しようとする。

コードにすると↓こんな感じ。

var root = new XElement("Root",
            new XElement("Elm1", 12345),
            new XElement("Elm2", 12345),
            new XElement("Elm3", 12345));

root.SetElementValue("Elm2", 23456);

すると、なんと更新した要素以外の要素が削除されて↓のようになってしまう。

<Root>
  <Elm2>23456</Elm2>
</Root>

 

検索したら、報告はされているっぽかった。
[Mono-bugs] [Bug 699242] New: XElement.SetElementValue remove all other child elements

手元のMonoのバージョンが2.10.2なので、
最新版では既に直っているかもしれないが、
ざっとリリースノートを眺めた感じでは載っていなかった。

なのでまあ、とりあえずはめんどいので更新もせず、
以下のように書き直したら解決したのでした。

var root = new XElement("Root",
            new XElement("Elm1", 12345),
            new XElement("Elm2", 12345),
            new XElement("Elm3", 12345));

root.Element("Elm2").SetValue(23456);