在XML属性中包含“&”符号

3

问题

我们想要分配一个属性,其内容已经包含像"&这样的实体。
在这个例子中,我们希望标题属性为Stack "Stacky" Overflow

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

但它会转化为以下 XML 输出:
<Site Title="Stack &amp;quot;Stacky&amp;quot; Overflow" />


甚至在关于XmlElement.SetAttribute方法的文档中也说明了这种行为:

为了分配包含实体引用的属性值,用户必须创建一个XmlAttribute节点加上任何XmlTextXmlEntityReference节点,构建适当的子树并使用SetAttributeNode将其分配为属性的值。

3个回答

4

解决方案

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

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

$elem.SetAttributeNode($elemAttr);

XML输出:

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

可以使用属性值而不是InnerXml: $elemAttr.value = "Stack "Stacky" Overflow"; - Atara

1

不知道这是否有帮助

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

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

Stack &quot;Stacky&quot; Overflow

当然,这也是一种解决方案。但在我的情况下,我的字符串中有大量的&quot序列。我认为在这种情况下,我的解决方案更简单。还有一种可能性是调用实体解码函数(我不知道PS中确切的名称)。 - ComFreek
你尝试过简单设置它吗?$xml.Site.Title = 'Stack "Stacky" Overflow' - Shay Levy
抛出异常:“在此对象上找不到属性'otherAttr';请确保它存在且可设置。” - ComFreek

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接