XMLのエラーを回避するには

解決


はる  2004-03-04 04:13:08  No: 82388

VB6(SP4)、WIN2000、IE6(SP1)で開発をしています。
XMLの操作をしていて、BODYノード以下を別のDOMのBODY直下にアペンド
しているのですが、マシンによってエラーが発生してしまいます。
メッセージは「XMLドキュメント内では最上位の要素に限り取得できます」です。

A.appendChild B.selectCingleNode("//Body")
の部分で起きます。
A、BはともにDOMDocumentです。
Aは空のBodyノードを持っており、BのBodyノードには子ノードがあります。

動くマシンとmsxml.dllのバージョンを比較してみたのですが一致しています。
msxml3.dllもインストールされていますが、参照設定はmsxml.dllを
指定しています(エラーの出るマシンも出ないマシンも同じです)

XMLにかかわるものは何か他にもあるのでしょうか。
ご存知のかたがいらっしゃいましたらご教示ください。
よろしくお願いします


はる  2004-03-06 03:43:47  No: 82389

解決しました。
レジストリで、MSXML3の情報が混在し
こちらが優先となっていたためのようです。
xmlinst.exeですべてのMSXML関連の情報を削除し、
新たにMSXML.DLLをレジストリ登録したら
動くようになりました。

どうもありがとうございました。


魔界の仮面弁士  2004-03-06 07:41:45  No: 82390

# 既に解決されているようなので、余計なお世話かもしれませんが…。

> A.appendChild B.selectCingleNode("//Body")
> の部分で起きます。
> A、BはともにDOMDocumentです。

そのコードだと、エラーが出ない方が問題な気がします。
正しくは、
   A.documentElement.appendChild B.selectSingleNode("//Body")
では無いでしょうか?

今回の場合、例えば、
   A.loadXML "<test><Body/></test>"
   B.loadXML "<test><Body><data/></Body></test>"
のようなXML構造だとして、
  A.appendChild B.selectSingleNode("//Body")
が成り立ってしまうと、A側は
  <test><Body/></test><Body><data/></Body>
になってしまいますよね。

それから、セキュリティ上の問題と、パフォーマンスの問題から、
可能な限り、MSXML4(SP2)を利用される事をお奨めします。

# もし、MSXML3を使わなければならないのであれば、せめて、
# セキュリティパッチは最新の物をあてるようにしてください。


はる  2004-03-10 01:57:49  No: 82391

魔界の仮面弁士さん

レスありがとうございます。
このソースは、過去に他の人が作ったものなのですが、
相手先の環境のことがあり、勝手にソースをいじれないんです…
とりあえず自分のマシンでも動かす必要があったので方法を
模索しておりました。

さて
A.appendChild B.selectCingleNode("//Body")
の前に、
A.loadXML "<?xml version= …><Body></Body>"というコードがあるのですが、
実行後は、AのXMLプロパティは空になっていました(msxml.dllをレジストリ登録)
msxml3.dllにすると同プロパティは<?xml version="1.0"><Body></Body>
でしたので、エラーになって当然ですね。

ご助言ありがとうございました。
いずれ全体の環境のアップグレードはあると思うので、心に留めておきます。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加