Здесь много шума из UTF-8, но метод DOMDocument.save () использует PI для определения того, как кодировать сохраненный вывод. Единственное препятствие заключается в том, что для форматированного вывода вместо экономичного вывода (без пробелов) необходимо использовать SAX Writer.
В принципе, похоже, все работает так, как ожидалось. В этом нет ничего хакерского, это то, как это делается.
Option Explicit
Private Sub Main()
Dim varStock As Variant
Dim docStock As MSXML2.DOMDocument
Dim elemRoot As MSXML2.IXMLDOMElement
Dim elemStock As MSXML2.IXMLDOMElement
Dim elemField As MSXML2.IXMLDOMElement
Dim I As Integer
varStock = Array(Array("12345", 10.32), _
Array("¥45632", 5.43)) 'Yen sign used here to show Unicode.
Set docStock = New MSXML2.DOMDocument
With docStock
.appendChild .createProcessingInstruction("xml", _
"version=""1.0"" encoding=""utf-8""")
Set elemRoot = .createElement("ArrayOfStock")
With elemRoot
.setAttribute "xmlns:xsi", "http://www.w3.org/2001/XMLSchema-instance"
.setAttribute "xmlns:xsd", "http://www.w3.org/2001/XMLSchema"
For I = 0 To UBound(varStock)
Set elemStock = docStock.createElement("Stock")
With elemStock
Set elemField = docStock.createElement("ProductCode")
elemField.Text = CStr(varStock(I)(0))
.appendChild elemField
Set elemField = docStock.createElement("ProductPrice")
elemField.Text = CStr(varStock(I)(1))
.appendChild elemField
End With
.appendChild elemStock
Next
End With
Set .documentElement = elemRoot
On Error Resume Next
Kill "created.xml"
On Error GoTo 0
.save "created.xml"
End With
End Sub
Изучив выходной файл в поисках знака иены, вы увидите, что текст в кодировке UTF-8.
Если вы хотите, чтобы это было в памяти, а не на диске, вы можете .save () сделать что-то вроде объекта ADODB.Stream или просто использовать XMLHTTPRequest.send с DOMDocument в качестве аргумента (тела). Нет необходимости прибегать к супертяжелому варианту подхода Interop.