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, оно вернется как «Строка». Поэтому неудивительно, что может произойти несоответствие типов. Но почему только на этой машине?

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

Любые идеи?


person Stringfellow    schedule 23.02.2012    source источник


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

person Bob77    schedule 23.02.2012
comment
Спасибо, Боб. Конечно же, проблема была в изменении локали. Похоже, нам нужно провести большой рефакторинг, чтобы поддерживать разные языковые стандарты, поскольку таких неявных преобразований много. - person Stringfellow; 24.02.2012
comment
Если вы используете соответствующий XSD, то .nodeTypedValue по-прежнему работает, однако MSXML не поддерживает полный диапазон типов, поэтому вы можете закончить сбой на таких элементах, как dateTime.rfc1123. - person Bob77; 26.02.2012