この記事では、ASP で MSXML2.DOMDocument を使用して XML データを処理する場合の注意事項を主に紹介します。この記事では、注意が必要な 4 つの問題について説明します。
ASP が MSXML2.DOMDocument を使用してネットワーク上の XML ファイルを読み込む場合、load メソッドを呼び出す前に設定に注意する必要があります。
次のようにコードをコピーします。oXML.setProperty ServerHTTPRequest、true
つまり、ServerHTTPRequest リクエストが有効になっている場合、システム エラー -2146697209 は発生しません。
ASP で MSXML2.DOMDocument コンポーネントを使用する場合は、次の 4 つの状況に注意する必要があります。
次のようにコードをコピーします。<%
Dim oXML、oXMLError、ReturnValue、x
oXML = Server.CreateObject(MSXML2.DOMDocument) を設定します。
' DOMDocument が XML ファイルを非同期でロードするか同期的にロードするかを設定します
oXML.async = false'==========A
' 設定目的: True/False、サーバーセーフな ServerXMLHTTP コンポーネントを使用して XML ドキュメントをロードするかどうかを示します。
oXML.setProperty ServerHTTPRequest、true'==========B
'HTTP経由でネットワークxmlファイルをロードします
ReturnValue = oXML.Load(http://localhost/asp/ServerXML.xml)'==========C
'またはサーバーのローカル XML ファイルをロードします
'ReturnValue = oXML.Load(d:/test.xml)'==========D
' DOMDocument.load の戻り値を出力します。
Response.write ロードメソッドの結果は = & ReturnValue & <br>
%>
最初のケース (空のドキュメントをロードする):
デフォルトでは、DOMDocument オブジェクトの async 属性は TRUE です。これは、オブジェクトが非同期でロードされることを意味します。 また、ServerXMLHTTP コンポーネントはロード時に使用されません。 つまり、上記のコードの行 A と行 B をコメント アウトします。
次のようにコードをコピーします。'oXML.async = false'==========A
'oXML.setProperty ServerHTTPRequest、true'==========B
この時点で読み込みは成功します。 ReturnValue は TRUE になります。 しかし、DOMDocument にロードされた XML ドキュメントは空です。つまり、load メソッドによって返される TRUE はカバーです。 結果は次のようになります。 この場合、プログラマは注意する必要があります。 XML はエラーを報告せず、load メソッドも成功を示しますが、DOM の xml 属性は空です。
2 番目のケース (エラーの理由: -2146697209):
async 属性を明示的に FALSE に宣言すると、XML ドキュメントは同期的にロードされます。 また、ServerXMLHTTP コンポーネントはロード時に使用されません。 つまり、上記のコードの行 B のみをコメントアウトします。
次のようにコードをコピーします。oXML.async = false'==========A
'oXML.setProperty ServerHTTPRequest、true'==========B
そうすれば失敗に遭遇するでしょう! ReturnValue は False になります。 エラーの理由は次のとおりです: -2146697209 - 必要なリソースに使用できるデータがありません。 つまり、インターネット上の XML リソースの同期ロードは成功しません。 !
3 番目のケース (許可されません):
async 属性が TRUE の場合、XML ドキュメントは非同期でロードされます。 また、ロード時に ServerXMLHTTP コンポーネントを使用します。 つまり、上記のコードの行 B を有効にします。コードの A 行目をコメントアウトします。
次のようにコードをコピーします。'oXML.async = false'==========A
oXML.setProperty ServerHTTPRequest、true'==========B
バグを報告しました! SXH コンポーネントを使用して XML ドキュメントを非同期にロードすることは許可されていないことに注意してください。 エラーの説明は次のとおりです: -1072897486 - ServerHTTPRequest プロパティは、ドキュメントを非同期で読み込む場合には使用できません。また、このプロパティは Windows NT 4.0 以降でのみサポートされます。
4 番目のケース (正しい使用法):
async 属性を明示的に FALSE に宣言すると、XML ドキュメントは同期的にロードされます。 また、ロード時に ServerXMLHTTP コンポーネントを使用します。 つまり、上記のコードの行 A と B を有効にします。
次のようにコードをコピーします。oXML.async = false'==========A
oXML.setProperty ServerHTTPRequest、true'==========B
それでおしまい!これは、SXH コンポーネントを使用して XML ドキュメントをロードすると、インターネット リソースの非同期ロードのエラーを修正できることを示しています。
要約する
積載方法 | 使用するかどうか ServerXMLHTTP コンポーネント | 結果をロードする |
非同期ロード | 未使用 | 読み込みは成功します。 しかし、DOMDocument にロードされた XML ドキュメントは空です |
同期ロード | 未使用 | 失敗にも遭遇しますよ!エラーの理由は次のとおりです: -2146697209 - 必要なリソースに使用できるデータがありません。 |
非同期ロード | 使用 | 許可されていません |
同期ロード | 使用 | 本当に成功した |