views:

352

answers:

3

I am trying to add and delete elements from a C# .csproj file. The file, in part, appears below. Can someone show me how I can do the following two things?

1) Add an element as shown below (the line that says, "I want to add this")

2) Delete an element. For example, say I wanted to delete the line I have indicated below.

<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="3.5" DefaultTargets="Build" 
xmlns="http://schemas.microsoft.com/developer/msbuild/2003"&gt;
   <PropertyGroup>
      <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
</PropertyGroup>
<ItemGroup>
   <Reference Include="System.Data" />    
   <Reference Include="System.Deployment" />
</ItemGroup>
<ItemGroup>
   <Compile Include="Generate\DatabaseContext.cs" />
   <Compile Include="Generate\EntityClasses.cs" />
   <Compile Include="Generate\Extensions.cs" />
   <Compile Include="Schema\Column.cs" />
   <Compile Include="Schema\EntityRef.cs" />
   <Compile Include="SerializedData\Tables.xml" />     (I want to add this)
</ItemGroup>
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
</Project>
+1  A: 

Ithink this should be fine

XDocument xmlDoc = XDocument.Load(Server.MapPath("People.xml"));

xmlDoc.Element("Persons").Add(new XElement("Person", new XElement("Name", txtName.Text),
new XElement("City", txtCity.Text), new XElement("Age", txtAge.Text)));

xmlDoc.Save(Server.MapPath("People.xml"));
Mustafa Magdy
Thank you. This answer would be more useful if it was adapted to my example.
Randy Minder
A: 

You can add your indicated line in the following way:

        XNamespace ns = "http://schemas.microsoft.com/developer/msbuild/2003";
        XDocument xDoc = XDocument.Load(fileName);

        var b = xDoc.Descendants(ns + "Compile").First();

        b.Parent.Add(
            new XElement(ns + "Compile", 
                new XAttribute("Include", @"SerializedData\Tables.xml")
            )
        );

        xDoc.Save(fileName);

To remove your indicated line, try this:

        XNamespace ns = "http://schemas.microsoft.com/developer/msbuild/2003";
        XDocument xDoc = XDocument.Load(fileName);

        var b = xDoc.Descendants(ns + "Compile")
            .Where(el => el.Attribute("Include").Value == @"SerializedData\Tables.xml");

        if (b != null)
        {
            b.Remove();

            xDoc.Save(fileName);
        }
Purrpler
A: 
        XDocument projects = XDocument.Load(fileName);
        XNamespace xmlns = "http://schemas.microsoft.com/developer/msbuild/2003";

        // Delete element (<Compile Include="SerializedData\Tables.xml" />);
        var query1 = from p in projects.Descendants(xmlns + "Project").Descendants(xmlns + "ItemGroup").Descendants(xmlns + "Compile") 
                     where p.Attribute("Include").Value == @"SerializedData\Tables.xml" select p;
        if (query1.Any())
        {
            XElement node = query1.Single();
            node.Remove(); 
        }

        //System.Diagnostics.Debug.WriteLine(projects);
        projects.Save(fileName);

        // Add the element.
        var query2 = from p in projects.Descendants(xmlns + "Project").Descendants(xmlns + "ItemGroup") where p.Descendants(xmlns + "Compile").Any() select p;
        if (query2.Any())
        {
            query2.Single().Add(new XElement(xmlns + "Compile", new XAttribute("Include", @"SerializedData\Tables.xml")));  
        }
        //System.Diagnostics.Debug.WriteLine(projects);
        projects.Save(fileName);
James