Вопрос

Я использую вариант на коде, который можно увидеть в «Как сделать XmldomDocument включать в себя декларацию XML?» (что также можно увидеть в MSDN. Анкет Если я изменю кодирование на «UTF-16», можно подумать, что это выведет как UTF-16 ... и это «делает» ... глядя на вывод в текстовом редакторе; Но проверяя его в шестнадцатеричном редакторе, отметка байтового порядка отсутствует (несмотря на то, что свойство устанавливается на True), и редакторы XML отклоняют документ как недействительный UTF-16, для пропавшего тела.

Что я упускаю из виду?

'' # Create and load a DOMDocument object.

Dim xmlDoc As New DOMDocument60
xmlDoc.loadXML("<doc><one>test1</one><two>test2</two></doc>")

'' # Set properties on the XML writer - including BOM, XML declaration and encoding

Dim wrt As New MXXMLWriter60
wrt.byteOrderMark = True
wrt.omitXMLDeclaration = False
wrt.encoding = "UTF-16"
wrt.indent = False

'' # Set the XML writer to the SAX content handler.

Dim rdr As New SAXXMLReader60
Set rdr.contentHandler = wrt
Set rdr.dtdHandler = wrt
Set rdr.errorHandler = wrt
rdr.putProperty "http://xml.org/sax/properties/lexical-handler", wrt
rdr.putProperty "http://xml.org/sax/properties/declaration-handler", wrt

'' # Now pass the DOM through the SAX handler, and it will call the writer

rdr.parse xmlDoc

'' # Let the writer do its thing

Dim iFileNo As Integer
iFileNo = FreeFile
Open App.Path + "\saved.xml" For Output As #iFileNo
Print #iFileNo, wrt.output
Close #iFileNo

Вывод выглядит как:

<?xml version="1.0" encoding="UTF-16" standalone="no"?>
<doc><one>test1</one><two>test2</two></doc>

Почему я использую VB6? На самом деле он находится в VBA (в том же поколении, небольшое подмножество VB6), используемое в качестве сценарии для сценария для EMC-Captiva InputAccel/Formware, поэтому переключение не является опцией.

Это было полезно?

Решение

Проблема в том, что когда вы получаете значение из вывода автора, вы получите строку. Поскольку строки в VB всегда UTF-16, это то, что вы получаете независимо от кодирования. Поскольку строки всегда являются UTF-16 в VB, их нет понятия о том, что они нуждаются в ролике, так что это тоже не включено.

Кодирование и свойства BOM влияют только на то, как писатель напишет XML, когда реализация ISTREAM назначенный к выходному свойству.

Попробуйте изменить код вокруг вызова, чтобы Parse следующим образом:-

Dim oStream As ADODB.Stream
Set oStream =  New ADODB.Stream
oStream.Open
oStream.Type = adTypeBinary

wrt.output = oStream

rdr.parse xmlDoc

oStream.SaveToFile App.Path + "\saved.xml"
oStream.Close

Это должно генерировать желаемый выход.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top