LINQ to XML - 将节点添加到.csproj文件

时间:2010-06-18 21:29:33

标签: c# xml linq linq-to-xml

我编写了一个生成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 个答案:

答案 0 :(得分:1)

为什么使用StreamReader然后使用XmlTextReader?只需将文件名传递给XDocument.Load即可。然后一切都按照您的预期运作。 如果您自己创建阅读器XDocument无法修改其设置,因此阅读器将报告随后存储在XLinq树中的空格,并在写出时禁用编写器中的自动格式。因此,您可以在阅读器上将IgnoreWhitespaces设置为true,或者将输入作为文件名传递,这将使XDocument使用自己的设置,包括IgnoreWhitespaces。

作为旁注,请不要使用XmlTextReader,当您调用XmlReader.Create时,会创建一个更符合规范的XML阅读器。