5

In the web.config file I have to enable httpGetEnabled and httpsGetEnabled attributes if they don`t exist.

$Path = "c:\web.config"
$XPath = "/configuration/system.serviceModel/behaviors/serviceBehaviors/behavior"
if ( Select-XML -Path $Path -Xpath $XPath ) {

    "Path available"
    $attributePath = $Xpath +="/serviceMetadata" 

    "Attribute path is $attributePath"
    If (Get-XMLAttribute -Path $Path -Xpath $attributePath -attribute "httpGetEnabled" ) {

        "httpGetEnabled is present"
    }
    ElseIf (Get-XMLAttribute -Path $Path -Xpath $attributePath -attribute "httpsGetEnabled") {

        "httpsGetEnabled is present"
    }
    Else {
        "Add both httpGetEnabled and httpsGetEnabled attribute with the value true and false accordingly"
        $attributeset = @" httpGetEnabled="false" "@
        New-Attribute -path $path -xpath $XPath -attributeset $attributeset
    }

I am able to set and get attribute values using PowerShell but I don't know how to add a new attribute using PowerShell. There isno help available using Get-help for adding attributes. How to add a new attribute using PowerShell?

2 Answers 2

14

I don't know where you're getting these XML cmdlets from, but it's much easier (and recommended) to just keep the XmlDocument in memory,

$xml = [xml] (Get-Content $Path)
$node = $xml.SelectSingleNode($XPath)
...

You also don't need to use XPath for simple paths. Elements in the tree can be accessed like objects.

$httpGetEnabled = $xml.serviceMetadata.httpGetEnabled

Anyway, to add the attribute:

function Add-XMLAttribute([System.Xml.XmlNode] $Node, $Name, $Value)
{
  $attrib = $Node.OwnerDocument.CreateAttribute($Name)
  $attrib.Value = $Value
  $node.Attributes.Append($attrib)
}

To save the file back, use $xml.Save($Path)

Sign up to request clarification or add additional context in comments.

2 Comments

Any idea why the node must have the attribute appended and also set?
Edited for clarification. The SetAttribute was just to set the value of the attribute. It's clearer now that I used $attrib.Value = $Value before the Append.
7

On PowerShellCore 6.2 I am able to add attribute like this.

Should work on any PowerShell version.

[xml]$xml = gc my.xml
$xml.element1.element2["element3"].SetAttribute("name", "value")

This works because while using the wrapper properties on XmlElement returns wrapped values, Using the indexing operator returns a pure Xml object. The native "SetAttribute" will create one if it does not exist.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.