Почему в строке, полученной методом «IXMLDocument.SaveToXML», отсутствует атрибут «кодировка»? - PullRequest
1 голос
/ 22 мая 2019

Я использую NewXMLDocument() для создания XML-документа моих данных.

Существует метод SaveToXML() для сохранения документа в строковой переменной в формате XML.

Проблемазаключается в том, что строка XML не содержит атрибута "encoding" в теге head.

Но если мы сохраним документ XML в файл с помощью метода SaveToFile(), атрибут "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"?

1 Ответ

2 голосов
/ 23 мая 2019

Вам необходимо использовать метод перегрузки IXMLDocument.SaveToXML(var XML: UTF8String).
, который будет кодировать xml в UTF-8 и добавить атрибут кодирования в заголовок xml.
Объявите XmlString как UTF8String, чтобы получитьжелаемый результат.

Когда вы объявляете XmlString как string, как вы это сделали, то есть UTF-16 (Unicode) в Delphi 2009+, вы на самом деле звоните SaveToXML(var XML: DOMString).DOMString определяется как UnicodeString.
По умолчанию переменные, объявленные как тип string, равны UnicodeString.Выходным xml является UTF-16, а атрибут кодирования опущен.

...