为什么用"IXMLDocument.SaveToXML"方法得到的字符串没有"encoding"属性?

Why is there no "encoding" attribute in a string got by "IXMLDocument.SaveToXML" method?

我使用 NewXMLDocument() 生成我的数据的 XML 文档。

有一个 SaveToXML() 方法可以将文档保存到 XML 格式的字符串变量。

问题是 XML 字符串在 head 标签中不包含 "encoding" 属性。

但是,如果我们用SaveToFile()方法将XML文档保存到一个文件中,"encoding"属性就会存在于其中。

这是我的代码:

var
  XML: IXMLDocument;
  RootNode, CurNode: IXMLNode;
  XmlString: string;
begin
  XML := NewXMLDocument;
  XML.Encoding := 'utf-8';
  XML.Options := [doNodeAutoIndent];
  RootNode := XML.AddChild('XML');
  CurNode := RootNode.AddChild('List');
  CurNode := CertList.AddChild('Item');
  CurNode.Text := 'bla-bla-bla';
  ...

  XMl.SaveToXML(XmlString);  // <<--- no "encoding" attribute here

  XMl.SaveToFile('my-list.xml');
  XMl := nil;
end;

有没有办法让SaveToXML()方法添加"encoding"属性?

您需要使用重载方法IXMLDocument.SaveToXML(var XML: UTF8String)
这会将 xml 编码为 UTF-8,并在 xml header.
中添加编码属性 将您的 XmlString 声明为 UTF8String 以获得所需的结果。

当您将 XmlString 声明为 string 时,即 Delphi 2009+ 中的 UTF-16 (Unicode),您实际上调用了 SaveToXML(var XML: DOMString)DOMString 定义为 UnicodeString.
默认情况下,声明为 string 类型的变量是 UnicodeString。输出xml为UTF-16,省略编码属性