2015-09-30 2 views
1

Я хочу удалить узел <Reference Include="System.Data" />Как удалить узел в файле csproj в C#?

из файла csproj программно. Моя csproj структура файла выглядит так:

<ItemGroup> 
    <Reference Include="Microsoft.CSharp" /> 
    <Reference Include="System.Data.OracleClient" /> 
    <Reference Include="System.Messaging" /> 
    <Reference Include="System.Web.DynamicData" /> 
    <Reference Include="System.Web.Entity" /> 
    <Reference Include="System.Web.ApplicationServices" /> 
    <Reference Include="System.ComponentModel.DataAnnotations" /> 
    <Reference Include="System" /> 
    <Reference Include="System.Data" /> 
    <Reference Include="System.Core" /> 
    <Reference Include="System.Data.DataSetExtensions" /> 
    <Reference Include="System.Web.Extensions" /> 
    <Reference Include="System.Xml.Linq" /> 
    <Reference Include="System.Drawing" /> 
    <Reference Include="System.Web" /> 
    <Reference Include="System.Xml" /> 
    <Reference Include="System.Configuration" /> 
    <Reference Include="System.Web.Services" /> 
    <Reference Include="System.EnterpriseServices" /> 
    </ItemGroup> 

Я пытаюсь к нему с этим кодом, но он не работает:

XmlDocument doc = new XmlDocument(); 
doc.Load(fullFilePath); 
XmlNode node = doc.SelectSingleNode(@"/Project/ItemGroup/Reference[@Include='System.Data']"); 

node.ParentNode.RemoveChild(node); 

doc.Save(fullFilePath); 
+3

"Это не работает" это * никогда * не достаточно информации. Что происходит, когда вы пытаетесь это сделать? (Я подозреваю, что проблема заключается в том, что вы игнорируете пространство имен элемента, которое по умолчанию используется частью xmlns = ... 'корневого элемента. Я также предлагаю использовать LINQ to XML как обычно лучший API, но это другое дело.) –

+0

вы должны использовать XmlNamespaceManager. jon skeet spotted! он # 1 !! – Dheeraj

ответ

0

Легко с XML Linq

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Xml; 
using System.Xml.Linq; 

namespace ConsoleApplication1 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      string input = 
       "<Root>" + 
        "<ItemGroup>" + 
         "<Reference Include=\"Microsoft.CSharp\" />" + 
         "<Reference Include=\"System.Data.OracleClient\" />" + 
         "<Reference Include=\"System.Messaging\" />" + 
         "<Reference Include=\"System.Web.DynamicData\" />" + 
         "<Reference Include=\"System.Web.Entity\" />" + 
         "<Reference Include=\"System.Web.ApplicationServices\" />" + 
         "<Reference Include=\"System.ComponentModel.DataAnnotations\" />" + 
         "<Reference Include=\"System\" />" + 
         "<Reference Include=\"System.Data\" />" + 
         "<Reference Include=\"System.Core\" />" + 
         "<Reference Include=\"System.Data.DataSetExtensions\" />" + 
         "<Reference Include=\"System.Web.Extensions\" />" + 
         "<Reference Include=\"System.Xml.Linq\" />" + 
         "<Reference Include=\"System.Drawing\" />" + 
         "<Reference Include=\"System.Web\" />" + 
         "<Reference Include=\"System.Xml\" />" + 
         "<Reference Include=\"System.Configuration\" />" + 
         "<Reference Include=\"System.Web.Services\" />" + 
         "<Reference Include=\"System.EnterpriseServices\" />" + 
         "</ItemGroup>" + 
        "</Root>"; 

      XDocument doc = XDocument.Parse(input); 
      List<XElement> itemGroup = doc.Descendants("ItemGroup").ToList(); 

      itemGroup.Elements("Reference").Where(x => x.Attribute("Include").Value == "System.Data").Remove(); 
     } 
    } 
} 
​ 
1

Когда вы через SelectNodes или SingleSelectNodes ничего не возвращает, это означает, что ваш запрос неверен. В этом случае элементы в .csproj принадлежат к пространству имен (здесь объявлен как пространство имен «по умолчанию» - ж/оа префикс)

<Project ... xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> 
... 
</Project> 

Так что ваш код должен быть изменен в этом:

XmlDocument doc = new XmlDocument(); 
XmlNamespaceManager nsmgr = new XmlNamespaceManager(new NameTable()); 
nsmgr.AddNamespace("p", "http://schemas.microsoft.com/developer/msbuild/2003"); 
doc.Load(fullFilePath); 
XmlNode node = doc.SelectSingleNode(@"/p:Project/p:ItemGroup/p:Reference[@Include='System.Data']", nsmgr); 

node.ParentNode.RemoveChild(node); 

doc.Save(fullFilePath); 

Обратите внимание, что префикс «p» может быть любым, он просто позволяет вам указать соответствующее пространство имен в выражении XPATH, но оно вам нужно, даже если в исходном документе оно объявлено как пространство имен по умолчанию.

Смежные вопросы