.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);