MSXML4 IXMLDOMNode.nodeTypedValue 在一台计算机上抛出类型不匹配异常

发布于 2025-01-08 02:27:53 字数 843 浏览 1 评论 0原文

我有一个 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”强制转换为布尔值?如果是这样,有什么办法强制它使用英语吗?

有什么想法吗?

I have a VB6 program that is failing on a particular machine.

The nature of the problem is code like this:

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

The program uses MSXML4, and this problem only occurs on one machine (so far), though it works on many other machines. Furthermore, the InUse attribute is defined in the XML schema as follows:

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

One more thing.

If I print out TypeName() of that .nodeTypedValue expression, it comes back as a "String". It's not terribly surprising, then, that a type mismatch might occur. But why only on that one machine?

As I'm thinking about it, that machine may have the Locale set to a different language than the other machines that I'm testing. Could that have something to do with it? Does VB6 use the locale determine how to coerce the string "false" into a boolean? If so, is there any way to force it to use English?

Any ideas?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

以为你会在 2025-01-15 02:27:53

是的,许多类型转换函数和隐式转换都是区域设置感知的。为了在这种情况下(特别是使用 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 并处理它。

Yes, many type conversion functions and implicit conversions are locale-aware. For reliable operation in a case like this (in particular with XML) use:

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

XML schemas are fairly "soft" creatures. You might want to look at:

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

Basically MSXML 4.0 is obsolete and not meant to be used anymore. Even then you need an XDR schema to get stronger typing. As of MSXML 6.0 XDR is not supported.

Effectively you ought to be using .nodeValue and just dealing with it.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文