MSXML4 IXMLDOMNode.nodeTypedValue, выбрасывающий исключение несоответствия типов на одной машине

У меня есть программа 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>

Еще кое-что.

Если я распечатываю TypeName() этого выражения.nodeTypedValue, он возвращается как "String". Поэтому неудивительно, что может произойти несовпадение типов. Но почему только на этой машине?

Пока я думаю об этом, на этой машине может быть установлен язык, отличный от других машин, которые я тестирую. Может ли это иметь какое-то отношение к этому? Использует ли VB6 локаль, чтобы определить, как привести строку "false" в логическое значение? Если так, есть ли способ заставить его использовать английский?

Есть идеи?

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 и просто иметь дело с ним.

Другие вопросы по тегам