【问题标题】:MSXML4 IXMLDOMNode.nodeTypedValue throwing Type mismatch exception on one machineMSXML4 IXMLDOMNode.nodeTypedValue 在一台机器上抛出类型不匹配异常
【发布时间】:2012-03-13 13:20:56
【问题描述】:

我有一个在特定机器上失败的 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”强制转换为布尔值?如果是这样,有什么方法可以强制它使用英文吗?

有什么想法吗?

【问题讨论】:

    标签: vb6 msxml msxml4


    【解决方案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 并处理它。

    【讨论】:

    • 谢谢,鲍勃。果然,语言环境的变化是问题所在。看起来我们需要进行大量重构才能支持不同的语言环境,因为有很多这些隐式转换。
    • 如果您使用适当的 XSD,那么 .nodeTypedValue 仍然可以工作,但是 MSXML 不支持全部类型,因此您最终可能会在 dateTime.rfc1123 项等内容上崩溃。
    猜你喜欢
    • 1970-01-01
    • 2017-07-11
    • 2014-05-23
    • 1970-01-01
    • 1970-01-01
    • 2021-06-28
    • 1970-01-01
    • 2015-03-11
    • 2011-04-16
    相关资源
    最近更新 更多