Подтвердить что ты не робот

Получение "ï" ¿"в начале моего XML файла после сохранения()

Я открываю существующий файл XML с С#, и я заменяю некоторые узлы там. Все работает нормально. Сразу после его сохранения я получаю следующие символы в начале файла:

  (EF BB BF in HEX)

Вся первая строка:

 <?xml version="1.0" encoding="UTF-8" standalone="yes"?>

Остальная часть файла выглядит как обычный файл XML. Упрощенный код здесь:

XmlDocument doc = new XmlDocument();
doc.Load(xmlSourceFile);
XmlNode translation = doc.SelectSingleNode("//trans-unit[@id='127']");
translation.InnerText = "testing";
doc.Save(xmlTranslatedFile);

Я использую приложение С# Windows Forms с .NET 4.0.

Любые идеи? Зачем это делать? Можем ли мы это как-то отключить? Это для Adobe InCopy, и он не открывает его так.

UPDATE: Альтернативное решение:

Сохранение его с помощью XmlTextWriter тоже работает:

XmlTextWriter writer = new XmlTextWriter(inCopyFilename, null);
doc.Save(writer);
4b9b3361

Ответ 1

Это спецификация UTF-8, которая фактически обескуражена стандартом Unicode:

http://www.unicode.org/versions/Unicode5.0.0/ch02.pdf

Использование спецификации не требуется ни рекомендуется для UTF-8, но может быть встречаются в контекстах, где UTF-8 данные преобразуются из другой кодировки формы, которые используют спецификацию или где спецификация используется как подпись UTF-8

Вы можете отключить его, используя:

var sw = new IO.StreamWriter(path, new System.Text.UTF8Encoding(false));
doc.Save(sw);
sw.Close();

Ответ 3

Вы можете попробовать изменить кодировку XmlDocument. Ниже приведен пример, скопированный из MSDN

using System; using System.IO; using System.Xml;

public class Sample {

  public static void Main() {

    // Create and load the XML document.
    XmlDocument doc = new XmlDocument();
    string xmlString = "<book><title>Oberon Legacy</title></book>";
    doc.Load(new StringReader(xmlString));

    // Create an XML declaration. 
    XmlDeclaration xmldecl;
    xmldecl = doc.CreateXmlDeclaration("1.0",null,null);
    xmldecl.Encoding="UTF-16";
    xmldecl.Standalone="yes";     

    // Add the new node to the document.
    XmlElement root = doc.DocumentElement;
    doc.InsertBefore(xmldecl, root);

    // Display the modified XML document 
    Console.WriteLine(doc.OuterXml);

  } 

}

Ответ 4

Как и все остальные, это проблема с Unicode.

Советую вам попробовать LINQ To XML. Хотя это и не очень важно, я упоминаю об этом как о простом по сравнению со старыми способами, и, что более важно, я предполагаю, что у него могут быть автоматические разрешения на такие проблемы без дополнительного кодирования от вас.