1

特定のマシンで失敗する VB6 プログラムがあります。

問題の性質は、次のようなコードです。

'this next line throws Type mismatch exception
If xml_file.documentElement.selectSingleNode("Node").Attributes.getNamedItem("InUse").nodeTypedValue Then
  'do some stuff
End If

このプログラムは MSXML4 を使用しており、この問題は (今のところ) 1 台のマシンでのみ発生しますが、他の多くのマシンでも機能します。さらに、InUse 属性は XML スキーマで次のように定義されています。

<xs:attribute name="InUse">
    <xs:simpleType>
        <xs:restriction base="xs:boolean">
            <xs:whiteSpace value="collapse"/>
        </xs:restriction>
    </xs:simpleType>
</xs:attribute>

もう一つ。

その .nodeTypedValue 式の TypeName() を出力すると、「文字列」として返されます。したがって、型の不一致が発生する可能性があることはそれほど驚くべきことではありません。しかし、なぜその 1 台のマシンだけでしょうか?

考えてみると、そのマシンの Locale は、テストしている他のマシンとは異なる言語に設定されている可能性があります。それと何か関係があるのでしょうか?VB6はロケールを使用して、文字列「false」をブール値に強制する方法を決定しますか? もしそうなら、強制的に英語を使う方法はありますか?

何か案は?

4

1 に答える 1

1

はい、多くの型変換関数と暗黙的な変換はロケールを認識します。このような場合 (特に XML を使用する場合) に信頼性の高い操作を行うには、次を使用します。

If LCase$(Trim$(string-expression)) = "true" Then

XML スキーマはかなり「ソフト」な生き物です。あなたは見たいと思うかもしれません:

http://msdn.microsoft.com/en-us/library/windows/desktop/ms762308(v=vs.85).aspx

基本的に、MSXML 4.0 は廃止されており、今後使用される予定はありません。それでも、強力な型付けを行うには XDR スキーマが必要です。MSXML 6.0 以降、XDR はサポートされていません。

事実上、.nodeValue を使用して、それを処理する必要があります。

于 2012-02-23T06:48:47.940 に答える