2010-06-18 57 views
3

我寫了一個代碼生成器,它生成C#文件。如果生成的文件是新的,我需要將它的引用添加到我們的.csproj文件。我有以下方法將節點添加到.csproj文件。LINQ to XML - 將節點添加到.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合併時會造成一些混亂。我如何在新行添加新節點?

+0

似乎很奇怪...正常的行爲是在序列化時縮進和格式化XML。我不認爲在xmlDoc.Save調用中將SaveOptions設置爲「None」會有所作爲? – womp 2010-06-18 21:36:39

+0

@Womp - 不,它沒有什麼區別,但是謝謝。 – 2010-06-18 21:45:45

+0

嘗試使用(XmlWriter writer = XmlWriter.Create(projectFileName))''然後使用'xmlDoc.Save(writer)'創建'XmlWriter'。 – 2010-06-18 22:06:28

回答

1

爲什麼你使用StreamReader然後XmlTextReader?只需將文件名傳遞給XDocument.Load。然後,一切都按照您的預期工作。 如果您自己創建閱讀器,XDocument無法修改其設置,因此讀者將報告存儲在XLinq樹中的空格,並在寫出時禁用作者的自動格式化。因此,您可以在閱讀器上將IgnoreWhitespaces設置爲true,或者將輸入傳遞爲文件名,這將使XDocument使用自己的設置,其中包含IgnoreWhitespaces。請注意,請不要使用XmlTextReader,當您調用XmlReader.Create時,會創建更符合規範的XML讀取器。

+0

謝謝!那就是訣竅。 – 2010-06-18 23:18:20