2012-04-25 3 views
9

Я использую powershell 2.0 для редактирования большого количества файлов csproj. Одним из требований для редактирования, чтобы добавить новый PropertyGroup с различным состоянием (Пожалуйста, проверьте пример ниже)Xml namespace и C# csproj

<PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'My-New-Env|AnyCPU'"> 

Проблема заключается в том, что PowerShell добавлены пустые Xmlns для всех новых PropertyGroup тегов, которые я добавил.

Например:

<PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'My-New-Env|AnyCPU'" xmlns=""> 

Есть ли способ, чтобы добавить новый узел XML без каких-либо имен?

Я попытался удалить атрибут пространства имен, используя код ниже, прежде чем добавлять новую PropertyGroup, но это не сработало. (Это означает, что атрибут не убирается, и я до сих пор можно увидеть пустое пространство имен после добавления нового узла.)

$content = [xml](gc $_.FullName);  

    Write-Host "Reading "$_.FullName -foregroundcolor yellow; 

    $project = $content.Project; 

    $content.Project.RemoveAttribute("xmlns"); 

Edit: Я следую за этот пост для добавления нового узла.

How to add new PropertyGroup to csproj from powershell

Пример:

$content = [xml](gc $_.FullName); 
    $importNode = $content.ImportNode($configs.DocumentElement, $true) 
    $project = $content.Project; 
    $project 
    $project.AppendChild($importNode); 
    # $content.Save($_.FullName); 
+0

Пожалуйста, добавьте код, который вы используете, чтобы добавить узлы. –

+0

@ Энди спасибо. Я добавил код ady. –

+0

Это тот же вопрос: http://social.technet.microsoft.com/Forums/en-US/winserverpowershell/thread/39af0a88-fedd-46d5-baea-12f8b2cfdacd (и основная проблема заключается в понимании пространств имен XML). – Richard

ответ

10

Глядя на эту тему: http://bytes.com/topic/net/answers/377888-importing-nodes-without-namespace, кажется, что она не может быть легко сделано, вы можете, однако идти с обходной путь:

Вместо :

$content.Save($_.FullName); 

Использование:

$content = [xml] $content.OuterXml.Replace(" xmlns=`"`"", "") 
$content.Save($_.FullName); 
+0

он отлично работает, но также удалил все «NewLine» из документа. Почему он удаляет «\ n» из doc? –

+0

@MichaelSync это может быть потому, что мы сохраняем XML как строку. Попробуйте обновления свыше –

+0

Спасибо! Оно работает! –

5

Документ csproj имеет пространство имен по умолчанию. Следовательно, при создании элемента вам нужно ссылаться на одно и то же пространство имен, иначе вы найдете xml, сгенерированный с xmlns, установленным в пустую строку.

Вот link, где я нашел решение

$elem = $content.CreateElement("PropertyGroup", $content.DocumentElement.NamespaceURI); 
$content.Project.AppendChild($elem);