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