投稿日 | : 2006/03/06(Mon) 03:44 |
投稿者 | : 魔界の仮面弁士 |
Eメール | : |
URL | : |
タイトル | : Re: VB6:msxml3 removeChildで複数のノード削除 |
ならば、以下のいずれかになりますよね。(MSXML6 のコードですが、MSXML3 でも同様でしょう)
'------------------
Set domData = New DOMDocument60
domData.Load "C:\test.xml"
Set nodeData = domData.documentElement
nodeData.removeChild nodeData.childNodes(0) 'id=1
nodeData.removeChild nodeData.childNodes(0) 'id=2
domData.save "C:\test.xml"
'------------------
Set domData = New DOMDocument60
domData.Load "C:\test.xml"
Set nodeData = domData.documentElement
nodeData.removeChild nodeData.childNodes(1) 'id=2
nodeData.removeChild nodeData.childNodes(0) 'id=1
domData.save "C:\test.xml"
'------------------
> 二つめを消す時にエラーがでてしまい困っています。
では、元のコードを追って見ましょうか。
そもそも、問題点は 2 つあります。
『nodeData 変数を使い回している』という点と、
『0番のノードを削除したあと、1番を削除している』という点です。
削除すればその分、インデックスもずれるという事に注意してください。
> Set nodeData = New DOMDocument30
> domData.Load("C:\test.xml")
えぇと。New する相手は domData ですよね? (^^;
そうしないと、domData の中身が Nothing のままですから…。
> Set nodeData= domData.documentElement()
この時点で、
domData =「<?xml version="1.0"?><List><test id="1">test1</test><test id="2">test2</test><test id="3">test3</test></List>」
nodeData =「<List><test id="1">test1</test><test id="2">test2</test><test id="3">test3</test></List>」
ですね。ここまでは 問題無かったのですが…次の行以降がマズイです。
> Set nodeData=nodeData.removeChild(nodeData.childNodes(0))
まず、ここで一つ目の問題があります。nodeData 変数の扱いです。
実行前の段階では、nodeData は List タグの内容を保持しており、
nodeData.childNodes(0) は「<test id="1">test1</test>」を指していますよね。
しかしながら、removeChild メソッドは、「削除されたノード」への参照を返すわけですから、
この行の実行により、nodeData の中身が「<test id="1">test1</test>」に変更されてしまいます。
すなわち、この行を実行すると、その結果はこうなります。
domData …… 「<?xml version="1.0"?><List><test id="2">test2</test><test id="3">test3</test></List>」
nodeData …… 「<test id="1">test1</test>」
> Set nodeData=nodeData.removeChild(nodeData.childNodes(1))
さて、nodeData が変更されてしまった事により、この行の実行結果に影響が出てきます。
この行を実行する時点で、nodeData = 「<test id="1">test1</test>」であったわけですから、
nodeData.childNodes(0) = 「test1」
nodeData.childNodes(1) は Nothing
となるわけです。
nodeData 変数の参照先を変更した事により、このような問題が生じたわけですね。
しかしながら、nodeData 変数の参照先を書き変えていなかったとしても、
もう一つの問題があります。先の removeChild により、id=1 は削除されていて
nodeData ……「<List><test id="2">test2</test><test id="3">test3</test></List>」
だけとなっているわけですから、その分、インデックスも一つずれて、
nodeData.childNodes(1) …「<test id="3">test3</test>」
を指す事になります。id=2 を指したいなら、インデックスは 0 ですよね。