Как сделать TXMLDocument (с Реализацией MSXML), всегда включают атрибут кодирования?

У меня есть унаследованный код (я не записал это), который всегда включал атрибут кодирования, но перекомпиляция его к 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';
9
задан Bruce McGee 27 July 2011 в 20:24
поделиться

2 ответа

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, чтобы получить НАКОНЕЦ правильно.

4
ответ дан 4 December 2019 в 21:08
поделиться

Вы захотите увидеть 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;
6
ответ дан 4 December 2019 в 21:08
поделиться
Другие вопросы по тегам:

Похожие вопросы: