Как сделать, чтобы TXMLDocument (с реализацией MSXML) всегда включал атрибут кодирования? - PullRequest
9 голосов
/ 03 мая 2010

У меня есть устаревший код (я его не писал), который всегда включал атрибут кодирования, но перекомпилируя его в 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';

Ответы [ 2 ]

6 голосов
/ 04 мая 2010

Вы захотите увидеть IXMLDocument.CreateProcessingStruction.Я использую OmniXML , но его синтаксис похож и должен помочь вам начать:

4 голосов
/ 04 мая 2010
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 - числовая константа char для возврата каретки). Итак, я использовал TStringStream, чтобы получить его НАКОНЕЦ верно.

...