MSXML2.DOMDocument.xml дает мне искаженный xml

У нас есть старая устаревшая система, в которой компонент написан на VB6. Один метод возвращает строку, которая представляет собой XML-данные. Данные xml создаются с помощью msxml3.dll MSXML2.DOMDocument и возвращают данные документа со свойством xml: http://msdn.microsoft.com/en-us/library/ms755989(v=VS.85).aspx

Однако некоторые данные xmldocument взяты из базы данных, а одно поле представляет собой хешированную строку пароля. Код, который устанавливает данные для элемента:

            Set cellNode = rowNode.appendChild(xml.createElement("COL"))
            If IsNull(rs(oField.name).Value) Then
                cellNode.Text = ""
            Else
                cellNode.Text = rs(oField.name).Value
            End If

Это дает мне искаженный/неправильный xml:

<ROWS><ROW><COL>r<í</COL></ROW></ROWS>

Есть ли обходной путь для этого?


person Torbjörn Hansson    schedule 09.11.2010    source источник
comment
Любопытный. Я не получаю такого же поведения, используя MSXML2.DOMDocument.3.0 через IE ActiveXObject.   -  person bobince    schedule 09.11.2010
comment
Может быть, это потому, что он в VB6 и не может правильно обрабатывать юникод?   -  person Torbjörn Hansson    schedule 09.11.2010
comment
VB6 имеет неполную поддержку Unicode, но с этим проблем быть не должно. Строки VB6 имеют внутреннюю кодировку Unicode, и когда вы вызываете MSXML2 через COM, строка останется в Unicode. Что произойдет, если вы попытаетесь установить cellNode.Text для других строк, которые содержат <, но не имеют диакритических знаков (придерживайтесь символов в ASCII 32-127)? Есть ли другие свойства cellNode, которые вы могли бы попробовать?   -  person MarkJ    schedule 10.11.2010
comment
Я попробовал cellnode.nodeValue и cellNode.appendChild(xml.createCDataSection(rs(oField.name).Value)) (но в этом случае вывод вообще не содержал никакого раздела cdata), но, похоже, ничего не работает. Я считаю, что он работает нормально, если я сохраняю файл с помощью xml.Save(), но не проверял его. В настоящее время портировал его на .net, где все в порядке.   -  person Torbjörn Hansson    schedule 10.11.2010


Ответы (1)


Вы должны избегать символов Юникода. Или поместите их в тег CDATA (хотя это не очень хорошее решение). Кстати, ‹ > и & также должны быть экранированы.

person Sjuul Janssen    schedule 04.04.2012