Как сохранить XmlDocument без пролога XML? - PullRequest
0 голосов
/ 19 марта 2020

При работе с файлами csproj как xml файлами (xmlDocument) каким-то образом после сохранения кодировка изменяется с UTF-8 на ASCII. Единственное решение, которое я понял, - это использование StreamWriter с заявленной кодировкой. Но это добавляет заголовок к файлу. Вопросы: 1. Знаете ли вы какое-либо другое решение этой проблемы? 2. Могу ли я оставить измененный csproj?

StreamReader sr = new StreamReader(projectFilePath, Encoding.UTF8);
XmlDocument xmlCsproj = new XmlDocument();
xmlCsproj.Load(sr);
sr.Close();

// Working on XML nodes (replace references paths)

StreamWriter sw= new StreamWriter(projectFilePath, false, Encoding.UTF8);
xmlCsproj.Save(sw);
sw.Close();

Ответы [ 2 ]

0 голосов
/ 19 марта 2020

Прежде всего, символьные значения UTF8 идентичны значениям US-ASCII в диапазоне 0-127. Невозможно сказать, был ли файл csproj сохранен как US-ASCII или UTF8, если только файл не содержал не-Engli sh текст, например пути не-Engli sh. Это то, что здесь произошло? Тем не менее, XmlDocument.Save должен был использовать UTF8 по умолчанию.

Вы можете контролировать, как XmlDocument записывается в поток или файл, используя XmlWriter и XmlWriterSettings. В этом случае вам нужно установить OmitXmlDeclaration :

XmlWriterSettings settings = new XmlWriterSettings();
settings.OmitXmlDeclaration = true;

var writer = XmlWriter.Create(projectFilePath, settings);
xmlCsproj.Save(sw);
sw.Close();

Кодировка по умолчанию - UTF8. Чтобы изменить его, вы можете установить для XmlWriterSettings.Encoding другое значение

0 голосов
/ 19 марта 2020

Это должно работать?

var writer = new XmlTextWriter(projectFilePath, Encoding.UTF8)
{
    Formatting = Formatting.Indented
};
xmlCsproj.WriteContentTo(writer);
writer.Close();
...