在子节点中的属性上需要xml名称空间前缀

时间:2015-05-28 16:03:44

标签: c# xml powershell namespaces xml-namespaces

我正在尝试修改ClickOnce部署清单。 我需要做的一件事是设置清单以将图标部署到桌面。 为此,您需要将具有true值的createDesktopShortcut属性添加到Deployment节点。

例如,这是一个工作部署文件的片段(有一些小的修改)。

<?xml version="1.0" encoding="utf-8"?>
<asmv1:assembly xsi:schemaLocation="urn:schemas-microsoft-com:asm.v1 assembly.adaptive.xsd"
                manifestVersion="1.0" 
                xmlns:asmv1="urn:schemas-microsoft-com:asm.v1" 
                xmlns="urn:schemas-microsoft-com:asm.v2" 
                xmlns:asmv2="urn:schemas-microsoft-com:asm.v2"
                xmlns:xrml="urn:mpeg:mpeg21:2003:01-REL-R-NS" 
                xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
                xmlns:asmv3="urn:schemas-microsoft-com:asm.v3"
                xmlns:dsig="http://www.w3.org/2000/09/xmldsig#" 
                xmlns:co.v1="urn:schemas-microsoft-com:clickonce.v1" 
                xmlns:co.v2="urn:schemas-microsoft-com:clickonce.v2">
  <assemblyIdentity name="My.app" version="1.2.3.4" publicKeyToken="redacted" language="neutral" processorArchitecture="x86" xmlns="urn:schemas-microsoft-com:asm.v1" />
  <deployment trustURLParameters="true" install="true" 
              minimumRequiredVersion="1.2.3.4"
              co.v1:createDesktopShortcut="true">
    <subscription>
      <update>
        <beforeApplicationStartup />
      </update>
    </subscription>
    <deploymentProvider codebase="redacted" />
  </deployment>
</asmv1:assembly>

请注意属性&#34; createDesktopShortcut&#34;以命名空间co.v1为前缀 此前缀似乎是必需的,但是如果您尝试使用Power Shell创建此元素,它将添加它而不带前缀,从而使xml无效。

[xml]$DeploymentManifest = Get-Content -Path $DeploymentPath 
$DeploymentManifest.assembly.SetAttribute("xmlns:co.v1", "urn:schemas-microsoft-com:clickonce.v1")
$DeploymentManifest.assembly.deployment.SetAttribute('co.v1:createDesktopShortcut',
                                                         'true')

这导致以下部署标记:

    <deployment trustURLParameters="true" install="true" 
            minimumRequiredVersion="1.2.3.4" 
            createDesktopShortcut="true" >

这没关系,但ClickOnce似乎无法处理没有前缀的属性。任何关于为什么会发生这种情况或如何干净利落地工作的指导都值得赞赏。

1 个答案:

答案 0 :(得分:1)

我不太清楚为什么这不起作用。它似乎与SetAttribute方法的文档相矛盾。但是,使用SetAttributeSetAttributeNode的其他重载确实对我有效。

通过SetAttribute:

$DeploymentManifest.assembly.deployment.SetAttribute('createDesktopShortcut', 'urn:schemas-microsoft-com:clickonce.v1', 'true')

或通过SetAttributeNode:

$att = $DeploymentManifest.assembly.deployment.SetAttributeNode('createDesktopShortcut', 'urn:schemas-microsoft-com:clickonce.v1')
$att.Value = 'true'

和输出:

<deployment trustURLParameters="true" 
    install="true" 
    minimumRequiredVersion="1.2.3.4" 
    co.v1:createDesktopShortcut="true">