Сохраните XML как XmlTextWriter, но с DOM - PullRequest
0 голосов
/ 10 октября 2010

Когда я создаю XML в C # с использованием XmlDocument и хочу сохранить в XML в файл, включая информацию о кодировке, я использую XmlTextWriter, как показано ниже:

    using (StringWriter swr = new StringWriter())
    {
        using (XmlTextWriter xtw = new XmlTextWriter(swr))
        {
            xmlDoc.WriteTo(xtw);
            return swr.ToString();
        }
    }

С приведенным выше кодомВозвращаемая строка имеет следующий синтаксис:

<?xml version="1.0" encoding="utf-8"?>
<regs>
  <reg1>
....
  </reg1>
</regs>

Я хотел бы иметь такое же поведение, используя методы IXMLDOMDocument.В этом кенарио я знаю, как извлечь строку XML только через метод xmlDoc.xml.Однако, используя этот метод, строка совершенно другая, как и кодировка:

<?xml version="1.0"?>
<regs>
  <reg1>
....
  </reg1>
</regs>

Есть ли способ вывести IXMLDOMDocument так же, как я получаю с XmlTextWriter, и с теми же результатами кодирования?
Tks

Редактировать

Код, который я использую для генерации XML через DOM, находится в Delphi:

function TXMLClass.GenerateXML: Variant;
var
  iCont: Integer;
  sName, sValor: String;
  vXML: Variant;
  oNodeDados, oNodeCliente, oNodeTransacao: Variant;
  oHeader: Variant;
begin
  vXML := CreateOLEObject('Msxml2.DOMDocument.6.0');
  try
    oHeader := vXML.createProcessingInstruction('xml', 'version=''1.0'' encoding=''utf-8''');
    vXML.AppendChild(oHeader);
    oNodeDados := vXML.CreateElement('regs');
    vXML.AppendChild(oNodeDados);
    oNodeCliente := vXML.CreateElement('reg1');
    oNodeDados.AppendChild(oNodeCliente);
    Result := vXML;
  except
    on e: Exception do
    begin
      vXML := Unassigned;
      Result := vXML;
      raise;
    end;
  end;
end;

Моя главная проблемаявляется результирующей кодировкой строки, потому что я передаю получившуюся WideString в C # WebService, и когда я читаю ее в XmlDocument, все символы с любым акцентом ошибочны.Когда я генерирую XML в C #, экспортирую его через XmlTextWriter и отправляю обратно в Delphi, и я загружаю его через DOM, символы правильные.

Редактировать

Когда я использую vXML.Save(file_name.xml), сохраненный файл кодируется правильно, и если я загружаю его в WideString (строку Unicode в Delphi) и передаю его в веб-службу, он работает хорошо.Но как я могу это сделать, не сохраняя его на диск и через DOM?

Ответы [ 3 ]

0 голосов
/ 10 октября 2010

Вы пытались использовать метод setOption(SXH_OPTION_URL_CODEPAGE,Encoding.UTF8) на корневом узле перед доступом к XML?

РЕДАКТИРОВАТЬ: Теперь я понимаю вопрос лучше.Вы должны правильно установить кодировку, когда вы пишете строку XML.Это очень распространенная проблема: установка кодировки в заголовке XML фактически не приводит к тому, что выходные данные соответствуют заявленной кодировке.Вы должны настроить средство записи (или любой другой объект, записывающий поток вывода) для фактического создания UTF8.

0 голосов
/ 10 октября 2010

Я ответил на аналогичный вопрос здесь .

В MSXML при сохранении файла будет также записана кодировка.Однако при использовании свойства xml кодировка не будет включена.Это было сделано намеренно.Они разработали его таким образом, чтобы вы могли повернуться и вызвать LoadXml в строке, и это сработает.Если кодировка была включена, вы получите ошибку Switch from current encoding to specified encoding not supported.Попробуйте сохранить документ, вызвав метод Сохранить .Вы увидите, что кодировка включена.

ОБНОВЛЕНИЕ:

Я не в том месте, где я могу это проверить, но метод Save может принимать несколько типов параметров.Один из них является объектом, который реализует интерфейс IStream.В качестве такового вы можете использовать объект ADODB.Stream .Я не знаю Delphi, поэтому я напишу шаги, которые нужно предпринять.

  • Создать экземпляр ADODB.Stream объекта
  • Установить его CharSet свойство "utf-8".По умолчанию utf-16
  • Вызов IXMLDOMDocument.Save с предоставлением объекта потока в качестве параметра
  • Сброс потоков Положение в 0 и установкаэто Введите в adTypeText
  • Вызовите ReadText для объекта потока, чтобы вернуть XML в виде строки
0 голосов
/ 10 октября 2010

Попробуйте явно передать Encoding.UTF8 в качестве второго параметра в конструктор.Смотри http://msdn.microsoft.com/en-us/library/ms162588(v=VS.80).aspx

...