ComFreek
ComFreek

Reputation: 29434

Include an ampersand in an XML attribute

The problem

We want to assign an attribute whose contents already contain entities like " or &.
In this example, we want the title attribute to be Stack "Stacky" Overflow:

$elem = $xml.CreateElement("Site");
$elem.SetAttribute("Title", "Stack "Stacky" Overflow");

But that turns into the following piece of XML output:

<Site Title="Stack &amp;quot;Stacky&amp;quot; Overflow" />


That behaviour is even stated in the documentation about the XmlElement.SetAttribute Method:

In order to assign an attribute value that contains entity references, the user must create an XmlAttribute node plus any XmlText and XmlEntityReference nodes, build the appropriate subtree and use SetAttributeNode to assign it as the value of an attribute.

Upvotes: 3

Views: 5134

Answers (3)

Webplanet TFS Consulting
Webplanet TFS Consulting

Reputation: 1269

Dont know if this helps

Add-Type -AssemblyName System.Web
$elem = $xml.CreateElement("Site");
$elem.SetAttribute("Title",[System.Web.HttpUtility]::HtmlDecode("Stack &quot;Stacky&quot; Overflow"));
$elem.OuterXml

Upvotes: 1

Shay Levy
Shay Levy

Reputation: 126902

PS> $xml.Site.Title = [System.Security.SecurityElement]::Escape('Stack "Stacky" Overflow')
PS> $xml.Site.Title

Stack &quot;Stacky&quot; Overflow

Upvotes: 0

ComFreek
ComFreek

Reputation: 29434

The solution

$elem = $xml.CreateElement("Site");

$elemAttr = $xml.CreateAttribute("Title");
$elemAttr.InnerXml = "Stack &quot;Stacky&quot; Overflow";

$elem.SetAttributeNode($elemAttr);

XML output:

<Site Title="Stack &quot;Stacky&quot; Overflow" />

Upvotes: 4

Related Questions