水無月ばけらのえび日記

bakera.jp > 水無月ばけらのえび日記 > 何故か減る XmlNodeList

何故か減る 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 が減って行くというのは、かなり違和感があります。このコード、どう見ても無限ループしそうに見えてしまうのですが……。

関連する話題: メモ / C# / プログラミング / hatomaru.dll

最近の日記

関わった本など