MSXML4 IXMLDOMNode.nodeTypedValue, выбрасывающий исключение несоответствия типов на одной машине - PullRequest
1 голос
/ 23 февраля 2012

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

1 голос
/ 23 февраля 2012

Да, многие функции преобразования типов и неявные преобразования зависят от локали.Для надежной работы в таком случае (в частности, с 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 и просто иметь дело с ним.

...