Vb6 MSXML4 IXMLDOMNode.nodeTypedValue在一台计算机上引发类型不匹配异常

Vb6 MSXML4 IXMLDOMNode.nodeTypedValue在一台计算机上引发类型不匹配异常,vb6,msxml,msxml4,Vb6,Msxml,Msxml4,我有一个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,尽管它可以在许多其他机器上工作,但这个问题只发生在一台机

我有一个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,尽管它可以在许多其他机器上工作,但这个问题只发生在一台机器上(到目前为止)。此外,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(),它会以“字符串”的形式返回。因此,可能出现类型不匹配也就不足为奇了。但为什么只在那台机器上

我在想,这台机器的语言环境可能与我正在测试的其他机器的语言环境不同。这可能与此有关吗?VB6是否使用区域设置确定如何将字符串“false”强制转换为布尔值?如果是,有没有办法强迫它使用英语


有什么想法吗?

是的,许多类型转换函数和隐式转换都是区域设置感知的。要在这种情况下(尤其是使用XML)可靠运行,请使用:

XML模式是相当“软”的生物。您可能想看看:

基本上,MSXML 4.0已经过时,不再使用。即使这样,您也需要一个XDR模式来获得更强的类型。自MSXML 6.0起,不支持XDR


实际上,您应该使用.nodeValue并处理它。

是的,许多类型转换函数和隐式转换都是区域设置感知的。要在这种情况下(尤其是使用XML)可靠运行,请使用:

XML模式是相当“软”的生物。您可能想看看:

基本上,MSXML 4.0已经过时,不再使用。即使这样,您也需要一个XDR模式来获得更强的类型。自MSXML 6.0起,不支持XDR


实际上,你应该使用.nodeValue并处理它。

谢谢,鲍勃。果然,语言环境的改变是个问题。看起来为了支持不同的地区,我们需要进行很多重构,因为有很多这样的隐式转换。如果您使用适当的XSD,那么.nodeTypedValue仍然可以工作,但是MSXML不支持所有类型,因此您可能会在dateTime.rfc1123项上崩溃。谢谢,Bob。果然,语言环境的改变是个问题。看起来为了支持不同的地区,我们需要做很多重构,因为有很多这样的隐式转换。如果使用适当的XSD,那么.nodeTypedValue仍然可以工作,但是MSXML不支持所有类型,因此最终可能会在dateTime.rfc1123项上崩溃。
If LCase$(Trim$(string-expression)) = "true" Then