我在看到的代码上使用了一个变体 “如何制作XmldomDocument包括XML声明?” (也可以看到 MSDN. 。如果我将编码更改为“ UTF-16”,人们会认为它将作为UTF-16 ...和“做” ...通过查看文本编辑器中的输出;但是,在十六进制编辑器中检查它,丢失了字节订单标记(尽管设置为true),而XML编辑器则拒绝文档为无效的UTF-16,以丢失BOM。

我在忽略什么?

'' # 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,这就是您所得到的,无论编码如何。由于字符串在VB中始终是UTF-16,因此没有任何需要BOM的想法,因此也不包括。

编码和BOM属性仅影响作者在ISTream的实现IS时将如何编写XML 分配 到输出属性。

尝试修改您的代码围绕呼叫进行解析,如下所示: -

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