【问题标题】:Require xml namespace prefix on attribute in child node在子节点中的属性上需要 xml 命名空间前缀
【发布时间】:2015-08-11 06:23:25
【问题描述】:

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

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

<?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>

请注意,属性“createDesktopShortcut”以命名空间 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 似乎无法在没有前缀的情况下处理该属性。任何关于为什么会发生这种情况或我如何能够干净地解决它的任何指导都表示赞赏。

【问题讨论】:

  • 我只是想建议不要手动修改 ClickOnce 部署清单。它会产生很多问题。经过大量工作后,我回到了一种更加标准的方法,并且运行起来更加清晰。需要明确的是,这是将针对 .NET 4.0 机器的产品的证书迁移到 SHA256 过程的一部分,这会产生许多问题。

标签: c# xml powershell namespaces xml-namespaces


【解决方案1】:

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

通过设置属性:

$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">

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-05-27
    • 2021-12-14
    • 2013-02-17
    • 2011-11-12
    • 2013-09-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多