Add an element to xml file

2019-05-21 00:46发布

问题:

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">
   <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:

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);
}


回答2:

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"));


回答3:

        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);