2012-02-23 15 views
1

特定のマシンで失敗しているVB6プログラムがあります。MSXML4 IXMLDOMNode.nodeTypedValue throwingあるマシンでタイプの不一致例外が発生する

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

プログラムはMSXML4を使用し、それは他の多くのマシン上で動作しても、この問題は、(今のところ)一台のマシン上で発生します。

問題の本質は、このようなコードです。さらに、InUse属性は、XMLスキーマで次のように定義されています。

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

もう1つ。

その.nodeTypedValue式のTypeName()を出力すると、「文字列」として返されます。タイプミスマッチが発生する可能性があることはひどく驚くことではありません。しかし、なぜそのマシンにしかないのですか?

私はそれについて考えているので、そのマシンは私がテストしている他のマシンとは異なる言語にロケールを設定しているかもしれません。それはそれと関係がありますか? VB6はロケールを使用して文字列 "false"をブール値に変換する方法を決定しますか?もしそうなら、それを強制的に英語を使う方法はありますか?

アイデア?

答えて

1

はい、多くの型変換関数と暗黙の変換はロケールに対応しています。このような場合(特にXMLの場合)の信頼性の高い操作のためには、次のようにします。XMLスキーマは、かなり "ソフトな"生き物です。あなたは見たいかもしれません:

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

基本的にはMSXML 4.0が廃止され、もはや使用することを意図していないです。それでも、より強力なタイピングを得るためにはXDRスキーマが必要です。 MSXML 6.0以降、XDRはサポートされていません。

効果的に、あなたは.nodeValueを使用して、それを扱うだけです。

+0

ありがとう、Bob。確かに、ロケールの変更が問題でした。これらの暗黙的な変換がたくさんあるので、さまざまなロケールをサポートするために行うリファクタリングがたくさんあるようです。 – Stringfellow

+0

適切なXSDを使用すると、.nodeTypedValueは引き続き動作しますが、MSXMLではすべての種類のタイプがサポートされないため、dateTime.rfc1123アイテムなどのクラッシュが発生する可能性があります。 – Bob77

関連する問題