Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Xml namespace and C# csproj

Tags:

powershell

xml

I'm using powershell 2.0 to edit a lot of csproj files. One of the requirements for editing is to add new PropertyGroup with different condition (Please check the example below)

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

The problem is that powershell added the empty xmlns for all new PropertyGroup tags that I have added.

Eg:

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

Is there any way to add new xml node without having any namespace?

I tried removing the namespace attribute by using the code below before adding new PropertyGroup but it didn't work. (meaning that attribute is not actually removed and I can still see the empty namespace after adding new node.)

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

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

    $project = $content.Project;

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

Edit: I'm following this post for adding new node.

How to add new PropertyGroup to csproj from powershell

Example:

$content = [xml](gc $_.FullName); 
  $importNode = $content.ImportNode($configs.DocumentElement, $true) 
  $project = $content.Project;
  $project
  $project.AppendChild($importNode);
  # $content.Save($_.FullName);
like image 748
Michael Sync Avatar asked Apr 25 '12 02:04

Michael Sync


People also ask

What is an XML namespace?

What Is an XML Namespace? An XML namespace is a collection of names that can be used as element or attribute names in an XML document. The namespace qualifies element names uniquely on the Web in order to avoid conflicts between elements with the same name.

Why is XML namespace needed?

One of the primary motivations for defining an XML namespace is to avoid naming conflicts when using and re-using multiple vocabularies. XML Schema is used to create a vocabulary for an XML instance, and uses namespaces heavily.

How do you declare a namespace in XML?

An XML namespace is declared using the reserved XML attribute xmlns or xmlns:prefix , the value of which must be a valid namespace name. Any element or attribute whose name starts with the prefix "xhtml:" is considered to be in the XHTML namespace, if it or an ancestor has the above namespace declaration.

Is namespace required in XML?

When using prefixes in XML, a namespace for the prefix must be defined. The namespace can be defined by an xmlns attribute in the start tag of an element. The namespace declaration has the following syntax.


2 Answers

Looking at this thread: http://bytes.com/topic/net/answers/377888-importing-nodes-without-namespace, it seems that it can't be easily done, you can, however go with a workaround:

Instead of:

$content.Save($_.FullName);

Use:

$content = [xml] $content.OuterXml.Replace(" xmlns=`"`"", "")
$content.Save($_.FullName);
like image 177
Andrey Marchuk Avatar answered Sep 20 '22 10:09

Andrey Marchuk


csproj document has default namespace. Hence when creating the element you need to refer to the same namespace otherwise you will find the xml generated with xmlns set to empty string.

Here is the link where I found the solution

$elem = $content.CreateElement("PropertyGroup", $content.DocumentElement.NamespaceURI);
$content.Project.AppendChild($elem);
like image 41
Bhavesh Avatar answered Sep 21 '22 10:09

Bhavesh