LINQ to XML - добавление узла в файл .csproj - PullRequest
3 голосов
/ 19 июня 2010

Я написал генератор кода, который генерирует файлы C #. Если генерируемый файл новый, мне нужно добавить ссылку на него в наш файл .csproj. У меня есть следующий метод, который добавляет узел в файл .csproj.

private static void AddToProjectFile(string projectFileName, string projectFileEntry)
{
    StreamReader streamReader = new StreamReader(projectFileName);
    XmlTextReader xmlReader = new XmlTextReader(streamReader);
    XElement element;
    XNamespace nameSpace;

    // Load the xml document
    XDocument xmlDoc = XDocument.Load(xmlReader);

    // Get the xml namespace
    nameSpace =  xmlDoc.Root.Name.Namespace;

    // Close the reader so we can save the file back.
    streamReader.Close();

    // Create the new element we want to add.
    element = new XElement(nameSpace + "Compile", new XAttribute("Include", projectFileEntry));

    // Add the new element.
    xmlDoc.Root.Elements(nameSpace + "ItemGroup").ElementAt(1).Add(element);

    xmlDoc.Save(projectFileName);
}

Этот метод работает отлично. Тем не менее, он не добавляет узел в новой строке. Он добавит его к предыдущей строке в файле .csproj. Это создает некоторую путаницу при объединении TFS. Как добавить новый узел в новую строку?

1 Ответ

1 голос
/ 19 июня 2010

Почему вы используете StreamReader, а затем XmlTextReader? Просто передайте имя файла в XDocument.Load. Тогда все работает так, как вы ожидаете. Если вы создаете ридер на своем собственном XDocument, вы не можете изменять его настройки, и, таким образом, ридер сообщает о пробелах, которые затем сохраняются в дереве XLinq, и при записи они отключают автоматическое форматирование в писателе. Таким образом, вы можете либо установить для IgnoreWhitespaces значение true в своем считывателе, либо передать ввод только в виде имени файла, что позволит XDocument использовать свои собственные настройки, включая IgnoreWhitespaces.

В качестве примечания, пожалуйста, не используйте XmlTextReader, при вызове XmlReader.Create создается XML-читатель, более совместимый со спецификациями.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...