У меня есть унаследованный код (я не записал это), который всегда включал атрибут кодирования, но перекомпиляция его к D2010, TXMLDocument больше не включает кодирование. Поскольку данные XML имеют символы с диакритикой и на тегах и на данных, TXMLDocument. LoadFromFile просто бросает EDOMParseErros, заявляя, что недопустимый символ найден на файле. Соответствующие нормы:
Doc := TXMLDocument.Create(nil);
try
Doc.Active := True;
Doc.Encoding := XMLEncoding;
RootNode := Doc.CreateElement('Test', '');
Doc.DocumentElement := RootNode;
<snip>
//Result := Doc.XMl.Text;
Doc.SaveToXML(Result); // Both lines gives the same result
На более старых версиях Delphi сгенерирована следующая строка:
<?xml version="1.0" encoding="ISO-8859-1"?>
На D2010 это сгенерировано:
<?xml version="1.0"?>
Если я изменяю вручную строку, всем работам всегда нравится работавший в прошлых годах.
ОБНОВЛЕНИЕ: XMLEncoding является константой и определяется следующим образом
XMLEncoding = 'ISO-8859-1';
var
XMLStream: TStringStream;
begin
Doc := TXMLDocument.Create(nil);
try
Doc.Active := True;
Doc.Encoding := XMLEncoding;
RootNode := Doc.CreateElement('Test', '');
Doc.DocumentElement := RootNode;
<snip>
XMLStream := TStringStream.Create;
Doc.SaveToStream(XMLStream);
Result := XmlStream.DataString;
XMLStream.Free;
После ответа Кена и ссылки на статью MSXML я решил исследовать свойство XML и метод SaveToXML. Оба используют свойство XML реализации MSXMLDOM, о котором в статье говорится, что не вносят кодировку при прямом чтении (в разделе «Создание новых XML-документов с помощью MSXML» сразу после использования метода CreateProcessInstruction).
ОБНОВЛЕНИЕ:
Я обнаружил, что акцентированные символы усекаются в результирующем XML. Когда обработчик этого XML начал выдавать странные ошибки, мы увидели, что символы преобразуются в числовую константу char (# 13 - числовая константа символа для возврата каретки). Итак, я использовал TStringStream, чтобы получить НАКОНЕЦ правильно.
Вы захотите увидеть IXMLDocument.CreateProcessingStruction. Я использую OmniXML , но его синтаксис похож, и вы должны начать:
var
FDoc: IXMLDocument;
PI: IXMLProcessingInstruction;
begin
FDoc := OmniXML.CreateXMLDoc();
PI := FDoc.CreateProcessingInstruction('xml', 'version="1.0" encoding="UTF-8"');
FDoc.AppendChild(PI);
end;