何故か減る XmlNodeList
2003年4月15日(火曜日)
何故か減る XmlNodeList
ある XML 文書の中に存在するいくつかの要素を全て newNode という XmlElement に置き換えたいと思って、こんな風に書いてみました。targetElements は対象となる XmlNode を要素に持つ XmlNodeList です。
※……最初の「要素」は XML の element, 次の「要素」は IList の item を指します。日本語にすると一緒だし……。
for(int i = 0; i < targetElements.Count; i++){ XmlNode appendNode = newNode.CloneNode(true); XmlNode replaced = targetElements[i]; replaced.ParentNode.ReplaceChild(appendNode, replaced); }
これ、コンパイルも実行も出来て例外も発生しないのですが、どうも期待通りの動作になりません。最初の要素は置換されるのですが、二番目以降の要素が単に消滅してしまいます。
おかしいと思いつつ、試しに以下のように書き直してみました。
foreach(XmlNode replaced in targetElements){ XmlNode appendNode = newNode.CloneNode(true); replaced.ParentNode.ReplaceChild(appendNode, replaced); }
すると例外発生。
System.InvalidOperationException: 要素一覧が変更されました。列挙操作を続行できませんでした。
なんと。Replace の操作って XmlNodeList の要素を削除している?
そこで書き直してみたのがこれ。
while(targetElements.Count > 0){ XmlNode replaced = targetElements[0]; XmlNode appendNode = newNode.CloneNode(true); replaced.ParentNode.ReplaceChild(appendNode, replaced); }
これで意図したとおりの動作になりました。
しかし、XmlNodeList のインスタンス targetElements に対しては何の操作もしていないのに targetElements.Count が減って行くというのは、かなり違和感があります。このコード、どう見ても無限ループしそうに見えてしまうのですが……。
- 「何故か減る XmlNodeList」にコメントを書く
関連する話題: メモ / C# / プログラミング / hatomaru.dll
- 前(古い): hatomaru.dll 0.9
- 次(新しい): 空の xmlns属性