水無月ばけらのえび日記

bakera.jp > 水無月ばけらのえび日記 > 2003年のえび日記 > 2003年4月 > 2003年4月15日(火曜日)

2003年4月15日(火曜日)

hatomaru.dll 0.9

そんなこんなでテンプレート対応を実装して hatomaru.dll 0.9 に。

これで「たい日記」も安心?

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

何故か減る 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

空の xmlns属性

XmlDocument の Load メソッドでもって XML をロードするとき、要素に xmlns属性が指定されていると、その子要素全てに xmlns="" が勝手に指定されているような……。

どうも、既に namespace が指定されている文書に対して、namespace を指定せずに CreateElement メソッドを呼んで作った要素を入れると、xmlns="" が追加される模様。なるほど……。

面倒なので、こんな感じで解決。

public new XmlElement CreateElement(string name){
    return base.CreateElement(name, "http://www.w3.org/1999/xhtml");
}

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

聖ベベル廟最下層クリア

FF10 (www.amazon.co.jp)には訓練場というのがあって、各地のモンスターをたくさん捕獲すると超強力な訓練場オリジナルモンスターと戦えます。訓練場オリジナルモンスターはもうとにかく強くて、ラスボスなど全く問題になりません。訓練場にしかいないから大丈夫ですが、もしそいつらが訓練場から逃げ出したりしたら、一体でも世界を滅ぼせるくらいの勢いです。

そこで思ったのが、訓練場のモンスターはどうして訓練場でおとなしくしているのか、ということ。訓練場は爺さんが一人で切り盛りしているようですが、モンスターが暴れ出したら、こんな爺さんは瞬殺のはず。ああ、スピラの命運は……。

……などと思っていたのですが、なんとこの疑問が FF10-2 (www.amazon.co.jp) で解決。

ラスボスを遙かに上回る滅茶苦茶な強さを誇るオリジナルモンスター。こいつらを爺さん一人でどう御しているのか?

何のことはありません、話は単純で、訓練場の爺さんはさらに強いのです。たとえモンスターが暴れ出しても、爺さんが瞬殺どころか、逆にモンスターの方が瞬殺されるので全く問題ないのでした。

関連する話題: ゲーム / スクウェア / ファイナルファンタジー / ファイナルファンタジーX-2

最近の日記

関わった本など